www.pudn.com > ntsniff.zip > PACKET32.C
/* * NtSniff by Davide Libenzi ( To rebuild NtSniff You need Microsoft SDK & DDK ) * Copyright (C) 1999 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi* */ #define UNICODE 1 #include #include #include #include #include TCHAR szWindowTitle[] = TEXT("PACKET32.DLL"); #if DBG #define ODS(_x) OutputDebugString(TEXT(_x)) #else #define ODS(_x) #endif BOOL PacketInit(IN PVOID DllHandle, IN ULONG Reason, IN PCONTEXT Context OPTIONAL) { BOOLEAN Status = TRUE; ODS("Packet32: DllEntry\n"); switch (Reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; default: break; } return Status; } PVOID PacketOpenAdapter(LPTSTR AdapterName) { LPADAPTER lpAdapter; ULONG Error; ODS("Packet32: PacketOpenAdapter\n"); lpAdapter = (LPADAPTER) GlobalAllocPtr( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ADAPTER)); if (lpAdapter == NULL) { ODS("Packet32: PacketOpenAdapter GlobalAlloc Failed\n"); return NULL; } wsprintf( lpAdapter->SymbolicLink, TEXT("\\\\.\\%s"), &AdapterName[8]); lpAdapter->hFile = CreateFile(lpAdapter->SymbolicLink, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if (lpAdapter->hFile != INVALID_HANDLE_VALUE) return lpAdapter; Error = GetLastError(); ODS("Packet32: PacketOpenAdapter Could not open adapter\n"); GlobalFreePtr(lpAdapter); return NULL; } VOID PacketCloseAdapter(LPADAPTER lpAdapter) { ODS("Packet32: PacketCloseAdapter\n"); CloseHandle(lpAdapter->hFile); GlobalFreePtr(lpAdapter); } PVOID PacketAllocatePacket(LPADAPTER AdapterObject) { LPPACKET lpPacket; lpPacket = (LPPACKET) GlobalAllocPtr( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(PACKET)); if (lpPacket == NULL) { ODS("Packet32: PacketAllocateSendPacket: GlobalAlloc Failed\n"); return NULL; } lpPacket->OverLapped.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL); if (lpPacket->OverLapped.hEvent == NULL) { ODS("Packet32: PacketAllocateSendPacket: CreateEvent Failed\n"); GlobalFreePtr(lpPacket); return NULL; } return lpPacket; } VOID PacketFreePacket(LPPACKET lpPacket) { CloseHandle(lpPacket->OverLapped.hEvent); GlobalFreePtr(lpPacket); } VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length) { lpPacket->Buffer = Buffer; lpPacket->Length = Length; } BOOL PacketSendPacket(LPADAPTER AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) { BOOL Result; DWORD BytesTransfered; lpPacket->OverLapped.Offset = 0; lpPacket->OverLapped.OffsetHigh = 0; if (!ResetEvent(lpPacket->OverLapped.hEvent)) { return FALSE; } Result = WriteFile( AdapterObject->hFile, lpPacket->Buffer, lpPacket->Length, &BytesTransfered, &lpPacket->OverLapped); if (Sync) { Result = GetOverlappedResult( AdapterObject->hFile, &lpPacket->OverLapped, &BytesTransfered, TRUE); } else { Result = TRUE; } return Result; } BOOL PacketReceivePacket(LPADAPTER AdapterObject, LPPACKET lpPacket, BOOLEAN Sync, PULONG BytesReceived) { BOOL Result; lpPacket->OverLapped.Offset = 0; lpPacket->OverLapped.OffsetHigh = 0; if (!ResetEvent(lpPacket->OverLapped.hEvent)) { return FALSE; } Result = ReadFile( AdapterObject->hFile, lpPacket->Buffer, lpPacket->Length, BytesReceived, &lpPacket->OverLapped); if (Sync) { Result = GetOverlappedResult( AdapterObject->hFile, &lpPacket->OverLapped, BytesReceived, TRUE); } else { Result = TRUE; } return Result; } BOOL PacketWaitPacket(LPADAPTER AdapterObject, LPPACKET lpPacket, PULONG BytesReceived) { return GetOverlappedResult( AdapterObject->hFile, &lpPacket->OverLapped, BytesReceived, TRUE ); } BOOL PacketResetAdapter(LPADAPTER AdapterObject) { UINT BytesReturned; DeviceIoControl( AdapterObject->hFile, (DWORD) IOCTL_PROTOCOL_RESET, NULL, 0, NULL, 0, &BytesReturned, NULL ); return TRUE; } BOOL PacketRequest(LPADAPTER AdapterObject, BOOLEAN Set, PPACKET_OID_DATA OidData) { UINT BytesReturned; BOOL Result; Result = DeviceIoControl( AdapterObject->hFile, (DWORD) Set ? IOCTL_PROTOCOL_SET_OID : IOCTL_PROTOCOL_QUERY_OID, OidData, sizeof(PACKET_OID_DATA) - 1 + OidData->Length, OidData, sizeof(PACKET_OID_DATA) - 1 + OidData->Length, &BytesReturned, NULL ); return Result; } BOOL PacketSetFilter(LPADAPTER AdapterObject, ULONG Filter) { BOOL Status; ULONG IoCtlBufferLength = (sizeof(PACKET_OID_DATA) + sizeof(ULONG) - 1); PPACKET_OID_DATA OidData; OidData = GlobalAllocPtr( GMEM_MOVEABLE | GMEM_ZEROINIT, IoCtlBufferLength ); if (OidData == NULL) { return FALSE; } OidData->Oid = OID_GEN_CURRENT_PACKET_FILTER; OidData->Length = sizeof(ULONG); *((PULONG) OidData->Data) = Filter; Status = PacketRequest( AdapterObject, TRUE, OidData ); GlobalFreePtr(OidData); return Status; } ULONG PacketGetAdapterNames(PTSTR pStr, PULONG BufferSize) { HKEY SystemKey; HKEY ControlSetKey; HKEY ServicesKey; HKEY NdisPerfKey; HKEY LinkageKey; LONG Status; DWORD RegType; Status = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SYSTEM"), 0, KEY_READ, &SystemKey ); if (Status == ERROR_SUCCESS) { Status = RegOpenKeyEx( SystemKey, TEXT("CurrentControlSet"), 0, KEY_READ, &ControlSetKey ); if (Status == ERROR_SUCCESS) { Status = RegOpenKeyEx( ControlSetKey, TEXT("Services"), 0, KEY_READ, &ServicesKey ); if (Status == ERROR_SUCCESS) { Status = RegOpenKeyEx( ServicesKey, TEXT("PacketCap"), 0, KEY_READ, &NdisPerfKey ); if (Status == ERROR_SUCCESS) { Status = RegOpenKeyEx( NdisPerfKey, TEXT("Linkage"), 0, KEY_READ, &LinkageKey ); if (Status == ERROR_SUCCESS) { Status = RegQueryValueEx( LinkageKey, TEXT("Export"), NULL, &RegType, (LPBYTE) pStr, BufferSize ); RegCloseKey(LinkageKey); } RegCloseKey(NdisPerfKey); } RegCloseKey(ServicesKey); } RegCloseKey(ControlSetKey); } RegCloseKey(SystemKey); } return Status; }