Проблемы асинхронных функций в Internet Explorer

Coordinator
Apr 20, 2011 at 9:09 PM

Проблема №1. Главная 

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

int WINAPI WSASend_proxy( __in   SOCKET s,

__in   LPWSABUF lpBuffers,

__in   DWORD dwBufferCount,

__out LPDWORD lpNumberOfBytesSent,

__in   DWORD dwFlags,

__in   LPWSAOVERLAPPED lpOverlapped,

__in   LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)

{

//          ATLASSERT(FALSE);

            WSAOVERLAPPED *Overlapped=new WSAOVERLAPPED;

            SecureZeroMemory((PVOID)Overlapped, sizeof(WSAOVERLAPPED));

 

            Overlapped->Internal=lpOverlapped->Internal;

            Overlapped->InternalHigh=lpOverlapped->InternalHigh;

            Overlapped->Offset=lpOverlapped->Offset;

            Overlapped->OffsetHigh=lpOverlapped->OffsetHigh;

            Overlapped->Pointer=lpOverlapped->Pointer;

            Overlapped->hEvent=lpOverlapped->hEvent;

//Overlapped->hEvent=WSACreateEvent();

            WSASendret=pTrueWSASend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,Overlapped,NULL);//Истинная функция WSASend

 

            lpOverlapped->Internal=Overlapped->Internal;

            lpOverlapped->InternalHigh=Overlapped->InternalHigh;

            lpOverlapped->Offset=Overlapped->Offset;

            lpOverlapped->OffsetHigh=Overlapped->OffsetHigh;

            lpOverlapped->Pointer=Overlapped->Pointer;

            lpOverlapped->hEvent=Overlapped->hEvent;

//Вывод на экран

                        char str[1000];

      sprintf(str,"lpOverlapped->hEvent= %p\n lpOverlapped->Internal= %p\n lpOverlapped->InternalHigh= %p\n lpOverlapped->Offset= %p\n lpOverlapped->OffsetHigh= %p\n lpOverlapped->Pointer= %p\n lpOverlapped= %p BytesSent= %p RET=%d",Overlapped->hEvent,                                                        Overlapped->Internal,                                                       Overlapped->InternalHigh,                                                    Overlapped->Offset,                                                          Overlapped->OffsetHigh,                                                     Overlapped->Pointer,lpOverlapped,*lpNumberOfBytesSent,WSASendret);

MessageBoxA(NULL, str, "HLoadLibraryA", MB_OK);

 

      return WSASendret;

}

На экран выведется MessageBox, но ОК нажать наверное не успеем и сразу возникнет ошибка.

Если использовать оригинальную структуру lpOverlapped, то всё нормально.

Эту дллку просто атачить через студию к эксплореру не получится, так как в этом случае не устанавливаются хуки. Они устанавливаются в DllMain. Но если нажать F5 и потом в появившемся окне указать путь к эксплореру, то студия начнёт его запускать и ещё в AppInit_Dlls написать путь к этой библиотеке, то всё будет нормально. Я так делал. В результате от дебаггера получил следующее

 

First-chance exception at 0x75469617 in iexplore.exe: 0x800706BA: Сервер RPC недоступен.

First-chance exception at 0x75469617 in iexplore.exe: 0x800706BA: Сервер RPC недоступен.

'iexplore.exe': Loaded 'ImageAtBase0x3720000'

'iexplore.exe': Unloaded 'ImageAtBase0x3720000'

First-chance exception at 0x75469617 in iexplore.exe: 0x800706BA: Сервер RPC недоступен.

First-chance exception at 0x75469617 in iexplore.exe: 0x800706BA: Сервер RPC недоступен.

'iexplore.exe': Unloaded 'D:\Windows\System32\NlsData0019.dll'

'iexplore.exe': Unloaded 'D:\Windows\System32\NlsLexicons0019.dll'

'iexplore.exe': Unloaded 'D:\Windows\System32\xmllite.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\linkinfo.dll'

The thread 'Win32 Thread' (0x578) has exited with code 0 (0x0).

The thread 'Win32 Thread' (0x4f4) has exited with code 0 (0x0).

'iexplore.exe': Unloaded 'D:\Program Files\Common Files\microsoft shared\ink\tiptsf.dll'

'iexplore.exe': Unloaded 'D:\Windows\System32\ExplorerFrame.dll'

'iexplore.exe': Unloaded 'D:\Windows\System32\dui70.dll'

'iexplore.exe': Unloaded 'D:\Windows\System32\duser.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\NlsData0019.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\NlsLexicons0019.dll', Binary was not built with debug information.

'iexplore.exe': Loaded 'D:\Windows\System32\tquery.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\StructuredQuery.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\secur32.dll'

The thread 'Win32 Thread' (0x4c4) has exited with code 0 (0x0).

'iexplore.exe': Loaded 'D:\Windows\System32\Wpc.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\wevtapi.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\samcli.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\samlib.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\netutils.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\ntshrui.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\srvcli.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\cscapi.dll'

'iexplore.exe': Loaded 'D:\Windows\System32\slc.dll'

The thread 'Win32 Thread' (0x1008) has exited with code 0 (0x0).

The thread 'Win32 Thread' (0x1650) has exited with code 0 (0x0).

The thread 'Win32 Thread' (0x12a0) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x1580) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x121c) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x15d0) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0xd7c) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x1144) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x15d4) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x1608) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x1508) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0x16cc) has exited with code 1 (0x1).

The thread 'Win32 Thread' (0xd0c) has exited with code 1 (0x1).

First-chance exception at 0x77495a97 in iexplore.exe: 0xC000000D: Службе или функции передан неверный параметр.

The program '[6140] iexplore.exe: Native' has exited with code 1 (0x1).

 

Я ставил брэйк поинты, но на них студия не останавливалась. В результате ошибки эксплорера Win7 предложит отладить программу. Там можно посмотреть на каком адресе произошла ошибка.

 

Проблема №2.

Я знаю следующие варианты как узнать, что асинхронная операция завершилась:

 

1)Используя функции завершения(в эксплорере в WSASend, WSARecv єто последний параметр и он всегда НУЛЛ).

 

2)С помощью любой Wait функции ожидать на сигнализацию события в структуре WSAOVERLAPPED, которую мы передавали в вызов асинхронной функции.(При вызове например WSASend эксплорер передаёт в функцию структуру с нулевым полем hEvent)

 

3) Используя порты завершнеия

CreateIoCompletionPort((HANDLE)Socket, hCompPort, (u_long)0, 0);…(В эксплорере после например WSARecv не следует этот вызов, проверял с пом WinAPIOverride32).

 

4)Можно использовать WSAGetOverlappedResult или GetOverlappedResult с флагом Wait=TRUE. The fWait parameter may be set to TRUE only if the overlapped operation selected the event-based completion notification.(Эти две функции также не вызываются)

 

5)Я предполагаю, но не проверял, что можно сокет кастовать к хэндлу и ожидать сигнализации этого хэндла функцией ожидания. Аналогично тому как это делается при асинхронной работе с файлами.(в експлорере вызываются Wait функции, но они не содержат в качестве хєндла значение равное значению сокета, который использовался в асинхронной операции напр WSARecv).

 

Ни один из этих способов не используется в эксплорере для оповещения о завершении асинхронной операции. Тогда какой способ там используется?