Показать сообщение отдельно
Старый 22.11.2009, 14:26   #1130
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 50
Сказал Спасибо: 10
Имеет 10 спасибок в 1 сообщении
murc пока неопределено
По умолчанию

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;
murc вне форума   Ответить с цитированием