Наверняка все знают такую хрень как Winpopup.exe - поставляеца с 9х виндой..
Так вот в чем фишка - когда сообщение на слот приходит, этот галимый попап СРАЗУ ЖЕ (без лагов) реагирует - т.е. показывает сообщение....
Возникает вопрос, как попап определяет что сообщение пришло.... Этот вопрос вызывает затруднения поскольку:
1. прога работает в один поток (проверял)
2. прога не юзает таймер (проверял)
3. прога не циклица на GetMailslotInfo или какйнть заумный ReadFile
4. если глянуть внутрь попапа - то там нет списка ф-ций который он юзает, видимо все импортица по ординалам....
Как же эти гады умудрились это провернуть.... Или они фишку знают? Может при получении мессаги генерица недокументированное системное сообщение или что то типа? КАК?
Как Билли умудрился это сделать????05.12.01 21:10 Автор: NeuronVikingIII Статус: Незарегистрированный пользователь
> Господа, обнаружил интересную фишку.... > > Наверняка все знают такую хрень как Winpopup.exe - > поставляеца с 9х виндой.. > > Так вот в чем фишка - когда сообщение на слот приходит, > этот галимый попап СРАЗУ ЖЕ (без лагов) реагирует - т.е. > показывает сообщение.... > Возникает вопрос, как попап определяет что сообщение > пришло.... Этот вопрос вызывает затруднения поскольку: > 1. прога работает в один поток (проверял) > 2. прога не юзает таймер (проверял) > 3. прога не циклица на GetMailslotInfo или какйнть заумный > ReadFile > 4. если глянуть внутрь попапа - то там нет списка ф-ций > который он юзает, видимо все импортица по ординалам.... > > Как же эти гады умудрились это провернуть.... Или они фишку > знают? Может при получении мессаги генерица > недокументированное системное сообщение или что то типа? > КАК? >
че ты голову себе ломаешь? это же часть МД ...
тем не менее05.12.01 21:12 Автор: BXS Статус: Незарегистрированный пользователь
мастдай не мастдай но мне надо самому mailslot'овый сервак написать... посему я хотел бы знать как это эффективнее сделать.... потому что юзать таймер или новый поток с циклом - это не по-отцовски как то......
Может подскажете чонть?
тем не менее05.12.01 21:17 Автор: BXS Статус: Незарегистрированный пользователь
сорри - соврал... не при компиляции а при исполнении....
ReadFileEx(SlotHandle,Buffer,100,0,(LPOVERLAPPED_COMPLETION_ROUTINE)Finished) - возвращает ошибку "Parameter is incorrect".
тут в чем дело и как можно еще процитать слот?
a example zapodlo posmotret`??05.12.01 21:38 Автор: + <Mikhail> Статус: Elderman
VOID IoCompletionRoutine(DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
{
// If an I/O error occurs, display the error and exit.
if (dwErrorCode)
{
printf("FATAL I/O Error %ld I/O Context %lx.%lx\n",
dwErrorCode, lpOverlapped, lpOverlapped->hEvent);
ExitProcess(dwErrorCode);
}
LocalFree(lpOverlapped);
}
Main Thread:
VOID IoWorkerThread(VOID)
{
HANDLE HandleVector[2];
DWORD CompletionStatus;
PIOREQUEST IoRequestPacket;
LPOVERLAPPED Overlapped;
BOOL IoOperationStatus;
HandleVector[0] = IoWorkerListLock;
HandleVector[1] = IoWorkerListSemaphore;
for(;;)
{
// Do an alertable wait on the handle vector. Both objects
// being signaled at the same time means that there is an
// I/O request in the queue and the caller has exclusive
// access to the queue.
CompletionStatus = WaitForMultipleObjectsEx(2, HandleVector,
TRUE, INFINITE, TRUE);
// If the wait failed, error out.
if (CompletionStatus == -1)
{
printf("FATAL WAIT ERROR %ld\n", GetLastError());
ExitProcess(1);
}
// If an I/O completion occurred, wait for another
// I/O request or I/O completion.
if (CompletionStatus != WAIT_IO_COMPLETION)
{
// The wait was satisfied. Ownership of the I/O
// request queue is exclusive, and there is something in
// the queue. To insert something in the queue, the
// inserter gets the list lock (mutex), inserts an entry,
// signals the list semaphore, and finally releases the
// list lock.
IoRequestPacket = RemoveHeadList(&IoRequestList);
ReleaseMutex(IoWorkerListLock);
// Allocate an overlapped structure.
Overlapped = LocalAlloc(LMEM_ZEROINIT,
sizeof(OVERLAPPED));
if (!Overlapped)
{
printf("FATAL allocation error\n");
ExitProcess(1);
}
Overlapped->Offset = IoRequestPacket->Offset;
Overlapped->OffsetHigh = IoRequestPacket->OffsetHigh;
Overlapped->hEvent =
IoRequestPacket->dwAdditionalIoContext;
if (IoRequestPacket->bRead)
{
IoOperationStatus =
ReadFileEx(IoRequestPacket->hFile,
IoRequestPacket->lpBuffer,
IoRequestPacket->dwTransferCount,
Overlapped, IoCompletionRoutine);
}
else
{
IoOperationStatus =
WriteFileEx(IoRequestPacket->hFile,
IoRequestPacket->lpBuffer,
IoRequestPacket->dwTransferCount,
Overlapped,
IoCompletionRoutine);
}
// Test to see if the I/O was queued successfully.
if (!IoOperationStatus)
{
printf("FATAL I/O Error %ld I/O Context %lx.%lx\n",
GetLastError(), Overlapped, Overlapped->hEvent);
ExitProcess(1);
}
// The I/O queued successfully. Go back into the
// alertable wait for I/O completion or for
// more I/O requests.
}
}
}
---
a example zapodlo posmotret`??05.12.01 21:47 Автор: BXS Статус: Незарегистрированный пользователь
> к тому же ты советуешь создавать новый поток а это > нежелательно.. winpopup реализован в рамках 1 потока.... > мне такая же фишка нужна
winpopup - 16-битовая программа
Так там что многопоточность невозможна в принципе :-))
В ф-ию DOSREADASYNCNMPIPE в качестве параметра передается адрес ф-ии ASYNCREADCALLBACK
Если интересно, вот список всех ф-й, импортируемых winpopup.exe:
Фак! А слона то и не заметил.. ))) про сущ-е 16 биток забыл совсем ))).... Простите дуру грешную... )) тогда дело ясно.....
I ni chego ne sovetuu, I scopiroval example is MSDN, a ty kak hochesh tak kruti ego! Vot chelovek upertyii pi..dec kakoito!!05.12.01 21:52 Автор: + <Mikhail> Статус: Elderman