WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Release & Debug

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Release & Debug
delitant опубликован 10-02-2002 17:06 MSK   Click Here to See the Profile for delitant   Click Here to Email delitant  
Сделал клиент /сервер полностью на API (программки более чем безобидные – знакомы попросил для какого то учебного заведения ). Debug версия работает прекрасно. Так вот когда я сделал Release версию сервера – dialog box, она откомпилировался нормально, но когда я закрываю ее происходит переполнение буфера!!! Что делать? Если кто то решит помочь, то я могу скинуть исходник на мыло (около трех сот строк). Заранее благодарен.
Svk опубликован 10-02-2002 17:57 MSK     Click Here to See the Profile for Svk  Click Here to Email Svk     
У меня когда-то были подобные глюки. Чаще всего это возникает в таких ситуациях:
1)Выделили память (new) но забыли освободить(delete)
2) обращения к элементу массива с более высоким номером чем длина массива
char buf[10];
buf[13] = 'o';

Поищите подобные ощибки

delitant опубликован 10-02-2002 19:50 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
Нет таких нет. По идее если бы они были, то в Debug версии они бы проявились (мне так кажется). Но в ней все работает просто прекрасно. HELP
Вот тот код у которого крупные проблемы в Release версии.
Плиз подскажите что я тут не заметил. Я конечно понимаю что вам не охота копаться в такой куче кода. Поэтому пойму если ответов не будет. Но тем не менее.


//------------------------------------------//
// Simple Server programm //
// coded by lukash (delitant) //
// compiler Visual C++ 6.0 SP3 //
// mail to: lukash@ukr.net //
//------------------------------------------//
#include <windows.h>
#include <stdio.h>

#define WM_CLIENT WM_USER+1
#define SHUTDOWNALL 100
#define SHUTDOWSEL 101
#define STARTALL 102
#define STARTSEL 103

SOCKET ListenSock, sock;
sockaddr_in local, addr;
HWND hwnd, hList, hShutA, hShutS, hCombo, hStartA, hStartS;
hostent *h;
char *Message = new char[256];
char *Title = new char[256];
char ip[4];

bool InitServer();
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WSADATA ws;
if( WSAStartup(0x0202,&ws) )
{
sprintf(Message,"Cant init Winsock2.2. %d - error", WSAGetLastError());
MessageBox(NULL,Message,"Error",NULL);
return 0;
}
memset(&sock,0,1000);
ListenSock = INVALID_SOCKET;

WNDCLASS wc;
memset(&wc,0,sizeof(WNDCLASS));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "CServer";
wc.lpszMenuName = NULL;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
if( !RegisterClass(&wc))
{
MessageBox(NULL,"Cant create window.",NULL,NULL);
return 0;
}
hwnd = CreateWindow("CServer","Server",
WS_SYSMENU | WS_CAPTION | WS_MINIMIZE | WS_VISIBLE | WS_CLIPSIBLINGS | WS_OVERLAPPED | WS_MINIMIZEBOX,
200,200,335,160,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOW);

if( !InitServer() ) return 0;

MSG msg;
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
return 0;
}
bool InitServer()
{
if( gethostname(Message,124) == SOCKET_ERROR )
{
sprintf(Message,"gethostname error - %d", WSAGetLastError());
MessageBox(hwnd,Message,"Error",NULL);
}
else
{
h=gethostbyname(Message);
sprintf(Title,"Server - %s : ",Message);
memcpy(&ip,h->h_addr,4);
sprintf(Message,"%d.%d.%d.%d",ip[0],ip[1],ip[2],ip[3]);
strncat(Title,Message,16);
SetWindowText(hwnd, Title);
}

ListenSock = socket(AF_INET,SOCK_STREAM,0);
if( ListenSock == INVALID_SOCKET )
{
sprintf(Message,"Socket error - %d", WSAGetLastError());
MessageBox(hwnd,Message,"Error",NULL);
return 0;
}

local.sin_addr.s_addr = INADDR_ANY;
local.sin_family = AF_INET;
local.sin_port = htons(55000);
if(bind(ListenSock,(sockaddr*)&local,sizeof(local)) == SOCKET_ERROR)
{
sprintf(Message,"Port 55000 is uzed");
MessageBox(hwnd,Message,"Error",NULL);
return 0;
}
if(listen(ListenSock,5) == SOCKET_ERROR)
{
sprintf(Message,"Listen error - %d", WSAGetLastError());
MessageBox(hwnd,Message,"Error",NULL);
return 0;
}
if(WSAAsyncSelect(ListenSock,hwnd,WM_CLIENT,FD_ACCEPT|FD_READ|FD_CLOSE) == SOCKET_ERROR )
{
sprintf(Message,"WSAAsyncSelect error - %d", WSAGetLastError());
MessageBox(hwnd,Message,"Error",NULL);
return 0;
}

return 1;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
int i,b,j;
i=b=j=0;
char *k = new char[1];
switch(msg)
{
case WM_CREATE:
//---------------------------------------------
hList = CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX","listbox",
WS_VISIBLE|WS_CHILD|LBS_HASSTRINGS|WS_VSCROLL|WS_HSCROLL,
10,10,150,130,hwnd,(HMENU)NULL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//--------------------- SHUTDOWNALL -----------
hShutA = CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON"," Shutdown All",
WS_VISIBLE|WS_CHILD,
170,10,150,20,hwnd,(HMENU)SHUTDOWNALL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//--------------------- SHUTDOWSEL ------------
hShutS= CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Shutdown Sellect",
WS_VISIBLE|WS_CHILD,
170,35,150,20,hwnd,(HMENU)SHUTDOWSEL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//---------------------------------------------
hCombo = CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX","ComboBox",
WS_VISIBLE|WS_CHILD|CBS_AUTOHSCROLL|CBS_HASSTRINGS|CBS_DROPDOWN,
170,60,150,20,hwnd,(HMENU)NULL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//--------------------- STARTALL --------------
hStartA= CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Start All",
WS_VISIBLE|WS_CHILD,
170,85,150,20,hwnd,(HMENU)STARTALL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//--------------------- STARTSEL --------------
hStartS= CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Start Sellect",
WS_VISIBLE|WS_CHILD,
170,110,150,20,hwnd,(HMENU)STARTSEL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//---------------------------------------------
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"calc");
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)"freecell");
break;
case WM_DESTROY:
shutdown(ListenSock,1);
closesocket(ListenSock);
WSACleanup();
delete[]Message;
delete[]Title;
delete[]h;
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(wParam)
{
case SHUTDOWNALL:
while( SendMessage(hList,LB_GETCOUNT,0,0) != 0)
{
b = SendMessage(hList,LB_GETTEXT,(WPARAM)0,(LPARAM)Message);
Message[b]='\0';
sock = atoi(Message);
send(sock,"Q",1,0);
shutdown(sock,1);
closesocket(sock);
SendMessage(hList, LB_DELETESTRING, 0, 0);
}
break;
case SHUTDOWSEL:
i = SendMessage(hList,LB_GETCURSEL,0,0);
if( i != LB_ERR)
{
b = SendMessage(hList,LB_GETTEXT,(WPARAM)i,(LPARAM)Message);
Message[b]='\0';
sock = atoi(Message);
send(sock,"Q",1,0);
shutdown(sock,1);
closesocket(sock);
SendMessage(hList, LB_DELETESTRING, i, 0);
}
break;
case STARTALL:
i = SendMessage(hList,LB_GETCOUNT,0,0);
if( i != LB_ERR)
{
j = i;
i = SendMessage(hCombo,CB_GETCURSEL,0,0);
if( i != CB_ERR )
{
SendMessage(hCombo,CB_GETLBTEXT,(WPARAM) i,(LPARAM) Message );
strncpy(k,Message,1);
while ( j != -1 )
{
SendMessage(hList,LB_GETTEXT,(WPARAM)j,(LPARAM)Message);
sock = atoi(Message);
switch(k[0])
{
case 'c':
send(sock,"1",1,0);
break;
case 'f':
send(sock,"2",1,0);
break;
}
--j;
}
}
else
MessageBox(hwnd,"No item in the ComboBox is curentli selected","Eorror",0);
}
else
MessageBox(hwnd,"No item in the ListBox is curentli selected","Eorror",0);
break;
case STARTSEL:
i = SendMessage(hList,LB_GETCURSEL,0,0);
if( i != LB_ERR)
{
i = SendMessage(hCombo,CB_GETCURSEL,0,0);
if( i != CB_ERR)
{
b = SendMessage(hList,LB_GETTEXT,(WPARAM)i,(LPARAM)Message);
sock = atoi(Message);
if( i != CB_ERR )
{
SendMessage(hCombo,CB_GETLBTEXT,(WPARAM) i,(LPARAM) Message );

switch(Message[0])
{
case 'c':
send(sock,"1",1,0);
break;
case 'f':
send(sock,"2",1,0);
break;
}
}
}
else
MessageBox(hwnd,"No item in the ComboBox is curentli selected","Eorror",0);
}
else
MessageBox(hwnd,"No item in the ListBox is curentli selected","Eorror",0);
break;
}
break;
//---------------------------- WM_CLIENT ----------------------------//
case WM_CLIENT:
switch(lParam)
{
case FD_ACCEPT:
i = sizeof(addr);
sock = accept(ListenSock,(sockaddr*)&addr,&i);
if( sock == INVALID_SOCKET )
{
sprintf(Message,"Accept error - %d", WSAGetLastError());
MessageBox(hwnd,Message,"Error",NULL);
break;
}
memcpy(&ip,&addr.sin_addr.s_addr,4);
sprintf(Message,"%d : ip - %d.%d.%d.%d",sock,ip[0],ip[1],ip[2],ip[3]);
SendMessage(hList, LB_ADDSTRING, 0,(LPARAM) Message);
break;
case FD_READ:
break;
case FD_CLOSE:
sprintf(Message,"%d",wParam);
Message[3]='\0';
i = SendMessage(hList, LB_FINDSTRING, 0,(LPARAM) Message);
if( i == LB_ERR )
MessageBox(NULL,"Andefaund connection","Error",0);
else
SendMessage(hList, LB_DELETESTRING, i, 0);
shutdown(wParam,1);
closesocket(wParam);
break;
}
break;
}
delete[] k;
return DefWindowProc(hwnd,msg,wParam,lParam);
}

Valery опубликован 10-02-2002 21:06 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Посмотри, вот эта строчка может не совсем корректна?
delete[]h;
Valery опубликован 10-02-2002 21:11 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Вот кстати, что по поводу этой структуры написано в MSDN'е:

The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls.

Так что убирай, наверное, этот delete вообще

delitant опубликован 10-02-2002 21:34 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
Нет. Я до того как выставил исходник я протестировал программу на delete (а именно закомментировал delete) это не как не повлияло на программу. Так что проблема осталась : (((
rivitna опубликован 10-02-2002 22:48 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 delitant:
Я мельком посмотрел исходник, действительно тяжело ориентироваться в таком виде, каков он есть на сайте.
Мне сразу бросились две вещи в глаза:
1) Оконная процедура сделана как-то нестандартно - все проходит через DefWindowProс.
2) При каждом вызове происходит динамическое выделение/освобождение памяти для переменной k - нехороший стиль.
Сделай k статической, выделяй в WM_CREATE, освобождай в WM_DESTROY.
А еще лучше - сделай стековой локальной переменной.

Я еще посмотрю...

Valery опубликован 10-02-2002 23:15 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
спорь не со мной, спорь с MSDN'ом :)
написано же - не должна удаляться, я не утверждаю, что собака именно сдесь порылась, может еще где. Да вот и rivitna не спит, он тоже чего подскажет.
2rivitna:
насчет k с тобой согласен, хотя это и не ошибка, но стиль плохой.
server_mouse опубликован 10-02-2002 23:26 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Часто болезнь relise-версий заключается в том, что такой код, в отличии от debug, не обнуляет значения переменных при их создании. Попробуй всем переменным принудительно сделать NULL, а структурам memset.
На крайняк запусти релиз под отладкой (выключи оптимизацию, включи отладочную инф. в настройках проекта). Выяснишь хотя бы на какой строчке всё валится.
delitant опубликован 10-02-2002 23:45 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
2rivitna насчет выдиления памяти ты правельно подметил. Я решил вообще все динамически выделяемые перименные (а именно k) сделать глобальной
вышло вот так
hostent *h;
char *Message = new char[256];
char *Title = new char[256];
char *k = new char[1];
char ip[4];

case WM_DESTROY:
shutdown(ListenSock,1);
closesocket(ListenSock);
WSACleanup();
delete[]Message;
delete[]Title;
delete[]h;
delete[]k;
PostQuitMessage(0);
break;
но ошибка не ушла, тогда я решил выделить память в начале WinMain
char *Message; // = new char[256];
char *Title; // = new char[256];
char *k; // = new char[1];
char ip[4];

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WSADATA ws;
if( WSAStartup(0x0202,&ws) )
MessageBox(NULL,Message,"Error",NULL);
return 0;
}
memset(&sock,0,1000);
ListenSock = INVALID_SOCKET;

Message = new char[256];
Title = new char[256];
k = new char[1];
и так заработало!!!!!!!
И что самое интересно что мне честно говоря не понятно. Если сделать вот так то все нормально
char *Message = new char[256];
char *Title;// = new char[256];
char *k; // = new char[1];

WinMain(……)
{
//Message = new char[256];
Title = new char[256];
k = new char[1];

а вто так нет
char *Message = new char[256];
char *Title = new char[256];
char *k; // = new char[1];

WinMain(……)
{
//Message = new char[256];
//Title = new char[256];
k = new char[1];

т.е. если есть несколько глобальных переменных (указателей) то сразу можно выделить память только под одну. А все остальные в функциях (в данном случае в main). Если сразу попытаться выделить более одной, то в момент их удаления (закрытия программы) появится ошибка переполнение стека. Возможно я не ясно выражаюсь, а также, в моих словах ест неточности, но суть проблемы, как мне кажется такова.

rivitna опубликован 11-02-2002 12:00 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Искренне рад за тебя! :)

Наведи порядок в оконной процедуре: зачем по каждому оху и вздоху запускать DefWindowProc?

В плане памяти придерживаюсь таких правил:
- если возможно и размер не выше 64 байт, то это - локальная стековая переменная. Зачем по пустякам тревожить кучу?
(k как раз такая переменная)
- все глобальные переменные, которые требуют динамическое выделение памяти инициализирую по событию WM_CREATE, освобождаю - по событию WM_DESTROY.

frostbitten опубликован 11-02-2002 04:20 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
Ой! Ну народ! Нет слов.

1. Что это за "memset(&sock,0,1000);" в ~38 строке? sizeof(sock) == 4 (!!!) А вы его так!

2. Сказали же один раз что НЕЛЬЗЯ ничего делать с результатом gethostbyname, кроме как копировать его поля _сразу же_ после вызова. А вы его берете и цппшным delete[]'ом (!). Эта структура одна для каждого треда (отсюда предположение, что ее создают в DllMain WS2.DLL (или как ее там) при DLL_THREAD_ATTACH... и удаляют ее там же при DLL_THREAD_DETACH) Руки проч короче.

3. А вообще траблы с выделением памяти лечаться пробегом с delete[] h; по исходику пока не начнет сбоить... вот перед этим местом и фиксить.

Valery опубликован 11-02-2002 08:19 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2frostbitten:
нда, такой memset я проглядел. Я ж говорил, что баги поодиночке не ходят. :)
удивительно, как у него вообще и в дебаге работало, хотя... чего ж удивительного - все глобальные переменные тривиальные, без инициализации чем-то, отличным от нуля, он этим мемсетом их скопом проинициализировал.
Тем не менее из-за этого программа могла не запускаться/не работать вообще, а он ищет с чего при закрытии валится. Там и я искал. Напрасно-с.
Valery опубликован 11-02-2002 08:23 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
а ведь вообще не должна работать. глобальные указатели Message, Title память получили до вызова InitServer(), а тут он их... И указывают они после этого в вакуум по адресу 0. GPF должно бы быть, или он не под энтей?
delitant опубликован 11-02-2002 08:36 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
2Valery. Может мой вопрос покажется более чем глупый, но что такой GPF.
Valery опубликован 11-02-2002 09:49 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
GPF - General Protection Fault, ошибка нарушения защиты памяти, кажется так, знатоки английского если что поправят. Возникает когда твое приложение пытается сунуться по адресу, который (адрес) ему (приложению) не принадлежит.
delitant опубликован 11-02-2002 17:19 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
2frostbitten это кусок старого кода, который я забыл удалить :))) просто я раньше предполагал использовать массив сокетов
Moroz опубликован 12-02-2002 19:34 MSK     Click Here to See the Profile for Moroz  Click Here to Email Moroz     
Посмотри на www.rsdn.ru там есть статья по поводу release мож чем поможет
x опубликован 13-02-2002 06:13 MSK     Click Here to See the Profile for x  Click Here to Email x     
GPF=нарушение общей защиты
вообще-то ,как ты выразился, приложение
может ни к чему и не обращаться

пример
mov ax,cs
mov fs,ax =все нормально

mov ax,ffff
mov fs,ax =GPF
потому что в LDT его просто нет

заметь что к LDT memory кусок кода не обращается и может не иметь привелегий даже на его чтение,не говоря уж об остальном

Valery опубликован 13-02-2002 08:22 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2x:
сенькс, что поправил. с этой стороной GPF я незнаком. с указателями промахиваться доводилось, а вот этот пример на асме, что ты привел - он насколько реален для C/C++? То есть не используя асмовые вставки есть повод на такие грабли наехать?
x опубликован 14-02-2002 02:46 MSK     Click Here to See the Profile for x  Click Here to Email x     
оч сильно сомневаюсь
вообще это конечно будет зависеть в первую очередь от твоего стиля и специфики конкретного приложения

ну разве что будешь SMC, EXE-Packer или Protection писать

Valery опубликован 14-02-2002 08:14 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
ну, тогда дышу ровно.
x опубликован 15-02-2002 02:23 MSK     Click Here to See the Profile for x  Click Here to Email x     
сорри=забыл одну вещь

все команды XMM(SSE) расширения выдают GPF
при обращении к адресу не выровненому на 16 байт

rivitna опубликован 15-02-2002 23:18 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 x:
Очень многие инструкции (не только SSE, даже из множества команд 386) выдают исключение #AC, если выполняются из Ring3 и включена проверка выравнивания, но отнюдь не #GP.

Сказанное про LDT относится и к GDT:
несуществующие селекторы вида
XXXXXXXXXXXXX0PPb

x опубликован 18-02-2002 02:54 MSK     Click Here to See the Profile for x  Click Here to Email x     
а вот тут ты пролажался
отстал от жизни можно сказать

BCE XMM КОМАНДЫ ВЫДАЮТ GPF ПРИ ОТСУТСТВИИ ВЫРАВНИВАНИЯ на 16 байт

ИМЕННО GPF а не AC и независимо от CPL и неважно включена ли проверка границ!!!!

rivitna опубликован 18-02-2002 07:18 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Бред!
Ну тады почитай доку от Интела, от чересчур вперед убежал!
Могу ссылку дать при наличии большого желания!
rivitna опубликован 18-02-2002 07:18 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Бред!
Ну тады почитай доку от Интела, а то от жизни чересчур вперед убежал!
Могу ссылку дать при наличии большого желания!
rivitna опубликован 18-02-2002 07:32 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 x:
Родной! Я не поленюсь тебе выписать:
--------------------------------------------
MOVQ

#GP(0) If the destination operand is in nonwritable segment.
If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
...
#AC(0) If alighment checking is enabled and an unaligned memory reference is made while the current privelege level is 3.
--------------------------------------------
24547101.pdf (2001)

В качестве эксперимента рекомендую обратиться из Ring0 к невыровненным данным

x опубликован 18-02-2002 09:14 MSK     Click Here to See the Profile for x  Click Here to Email x     
ты тут ко мне в родственники не набивайся!
бля я даже не знаю как тебя назвать!

что есть MOVQ= это MMX!!!!!!!!!!

а я говорю про XMM!!!!!!!!!!!!
смотри например ADDPS

rivitna опубликован 18-02-2002 13:51 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Пардон, был не прав! :)

Насчет родственника был не прав: на кой х мне нужен х, можешь дышать ровно, мой неизвестный друг

x опубликован 19-02-2002 15:00 MSK     Click Here to See the Profile for x  Click Here to Email x     
истина установлена=и это главное
GL man

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.