alexteam, Dll пашет до тех пор пока не выставляю хук на какую либо функцию (здесь WSPRecv). Перехват вроде как происходит, но инет отпадает как будто я дропаю wsprecv. В чем может быть проблема ?
Код:
function WSPRecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
var lpNumberOfBytesRecvd, lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE; lpThreadId: LPWSATHREADID;
var lpErrno: Integer): Integer; stdcall;
begin
result := NextProcTable.lpWSPRecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,
lpFlags,lpOverlapped,lpCompletionRoutine,lpThreadId,
lpErrno);
end;
function WSPStartup(wVersionRequested: WORD; lpWSPData: LPWSPDATA;
lpProtocolInfo: LPWSAPROTOCOL_INFOW; UpcallTable: WSPUPCALLTABLE;
lpProcTable: LPWSPPROC_TABLE): Integer; stdcall;
var
Count, Error, i, iLen: integer;
EnumBuf: LPWSAPROTOCOL_INFOW;
Len, LayerID, NextLayerID, hDLL: dword;
wDllPath, DllPath: PWideChar;
WSPStartupFunc: LPWSPSTARTUP;
begin
Len := $ffff;
GetMem(EnumBuf, Len);
Count := WSCEnumProtocols(nil, EnumBuf, Len, Error);
// Ищем свой номерок в каталоге
for i:=0 to count-1 do begin
if string(EnumBuf.szProtocol) = Layer then begin
LayerID := EnumBuf.dwCatalogEntryId;
break;
end;
EnumBuf := Pointer(Dword(EnumBuf)+SizeOf(TWSAPROTOCOL_INFOW));
end;
// Ищем следующего провайдера относительно нас
for i:=0 to lpProtocolInfo.ProtocolChain.ChainLen-1 do begin
if lpProtocolInfo.ProtocolChain.ChainEntries[i] = LayerID then begin
NextLayerID := lpProtocolInfo.ProtocolChain.ChainEntries[i+1];
break;
end;
end;
GetMem(EnumBuf, Len);
Count := WSCEnumProtocols(nil, EnumBuf, Len, Error);
for i:=0 to count-1 do begin
if EnumBuf.dwCatalogEntryId = NextLayerID then begin
iLen := 256;
GetMem(DllPath, iLen);
WSCGetProviderPath(EnumBuf.ProviderId, DllPath, iLen, Error);
GetMem(wDllPath, iLen);
ExpandEnvironmentStringsW(DllPath, wDllPath, iLen);
Break;
end;
EnumBuf := Pointer(Dword(EnumBuf)+SizeOf(TWSAPROTOCOL_INFOW));
end;
hDLL := LoadLibraryW(wDllPath);
WSPStartupFunc := LPWSPSTARTUP(GetProcAddress(hDLL,Pchar('WSPStartup')));
result := WSPStartupFunc(wVersionRequested, lpWSPData, lpProtocolInfo, UpcallTable, lpProcTable);
NextProcTable := lpProcTable;
lpProcTable.lpWSPRecv := WSPRecv;
end;