📄 packet32.c
字号:
ODS ("Packet32: PacketAllocatePacket: GlobalAlloc Failed\n");
return NULL;
}
lpPacket->OverLapped.hEvent = CreateEvent (NULL,
FALSE,
FALSE,
NULL);
if (lpPacket->OverLapped.hEvent == NULL)
{
ODS ("Packet32: PacketAllocatePacket: CreateEvent Failed\n");
GlobalFreePtr (lpPacket);
return NULL;
}
lpPacket->Buffer=NULL;
lpPacket->Length=0;
lpPacket->ulBytesReceived = 0;
lpPacket->bIoComplete = FALSE;
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;
}
//---------------------------------------------------------------------------
BOOLEAN PacketSendPacket (LPADAPTER AdapterObject,
LPPACKET lpPacket,
BOOLEAN Sync)
{
int i;
for(i=0;i<AdapterObject->NumWrites;i++){
if(PacketDeviceIoControl (AdapterObject,lpPacket,(ULONG) IOCTL_PROTOCOL_WRITE,Sync)==FALSE)
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
// Emulated at user-level under Win9x
INT PacketSendPackets(LPADAPTER AdapterObject,
PVOID PacketBuff,
ULONG Size,
BOOLEAN Sync)
{
struct dump_bpf_hdr *winpcap_hdr;
PCHAR EndOfUserBuff = (PCHAR)PacketBuff + Size;
LPPACKET PacketToSend;
BOOLEAN res;
// Start from the first packet
winpcap_hdr = (struct dump_bpf_hdr*)PacketBuff;
if( (PCHAR)winpcap_hdr + winpcap_hdr->caplen + sizeof(struct dump_bpf_hdr) > EndOfUserBuff )
{
// Malformed buffer
return 0;
}
while( TRUE ){
if(winpcap_hdr->caplen ==0 || winpcap_hdr->caplen > 65536)
{
// Malformed header
return 0;
}
// Set up the LPPACKET structure
PacketToSend=PacketAllocatePacket();
PacketInitPacket(PacketToSend,
(PCHAR)winpcap_hdr + sizeof(struct dump_bpf_hdr),
winpcap_hdr->caplen);
// Send the packet
res = PacketSendPacket (AdapterObject, PacketToSend, TRUE);
// Free the just used LPPACKET structure
PacketFreePacket(PacketToSend);
if(res == FALSE){
// Error sending the packet
return (PCHAR)winpcap_hdr - (PCHAR)PacketBuff;
}
// Step to the next packet in the buffer
(PCHAR)winpcap_hdr += winpcap_hdr->caplen + sizeof(struct dump_bpf_hdr);
// Check if the end of the user buffer has been reached
if( (PCHAR)winpcap_hdr >= EndOfUserBuff )
{
return (PCHAR)winpcap_hdr - (PCHAR)PacketBuff;
}
}
}
//---------------------------------------------------------------------------
BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,
LPPACKET lpPacket,
BOOLEAN Sync)
{
return PacketDeviceIoControl(AdapterObject,
lpPacket,
(ULONG) IOCTL_PROTOCOL_READ,
Sync);
}
//---------------------------------------------------------------------------
BOOLEAN PacketWaitPacket (LPADAPTER AdapterObject,
LPPACKET lpPacket)
{
lpPacket->bIoComplete = GetOverlappedResult( AdapterObject->hFile,
&lpPacket->OverLapped,
&lpPacket->ulBytesReceived,
TRUE );
return lpPacket->bIoComplete;
}
//---------------------------------------------------------------------------
BOOLEAN PacketResetAdapter (LPADAPTER AdapterObject)
{
UINT BytesReturned;
DeviceIoControl (
AdapterObject->hFile,
(DWORD) IOCTL_PROTOCOL_RESET,
NULL,
0,
NULL,
0,
&BytesReturned,
NULL);
return TRUE;
}
//---------------------------------------------------------------------------
BOOLEAN PacketRequest (LPADAPTER AdapterObject,
BOOLEAN Set,
PPACKET_OID_DATA OidData)
{
UINT BytesReturned;
BOOLEAN Result;
OVERLAPPED Overlap;
ODS ("Packet32: PacketRequest\n");
_ASSERTE (AdapterObject != NULL);
_ASSERTE (OidData != NULL);
_ASSERTE (OidData->Data != NULL);
Overlap.Offset = 0;
Overlap.OffsetHigh = 0;
Overlap.hEvent = CreateEvent (NULL,
FALSE,
FALSE,
NULL);
if (Overlap.hEvent == NULL)
{
ODS ("Packet32: PacketRequestPacket: CreateEvent Failed\n");
return FALSE;
}
if (!ResetEvent(Overlap.hEvent))
{
ODS ("Packet32: PacketRequestPacket: ResetEvent Failed\n");
CloseHandle(Overlap.hEvent);
return FALSE;
}
Result = DeviceIoControl (
AdapterObject->hFile,
(DWORD) Set ? pBIOCSETOID : pBIOCQUERYOID,
OidData,
sizeof (PACKET_OID_DATA) - 1 + OidData->Length,
OidData,
sizeof (PACKET_OID_DATA) - 1 + OidData->Length,
&BytesReturned,
&Overlap);
if (!Result)
{
if (GetLastError() == ERROR_IO_PENDING)
{
Result = GetOverlappedResult(AdapterObject->hFile,
&Overlap,
&BytesReturned,
TRUE);
}
else
{
ODS("Packet32: Unssupported API call return error!\n");
}
}
if (BytesReturned == 0)
{
// There was an ndis error
ODS ("Packet32: Ndis returned error to OID\n");
Result = FALSE;
}
CloseHandle(Overlap.hEvent);
return Result;
}
//---------------------------------------------------------------------------
BOOLEAN PacketSetHwFilter (LPADAPTER AdapterObject,
ULONG Filter)
{
BOOLEAN Status;
ULONG IoCtlBufferLength = (sizeof (PACKET_OID_DATA) + sizeof (ULONG) - 1);
PPACKET_OID_DATA OidData;
ODS ("Packet32: PacketSetFilter\n");
_ASSERTE (AdapterObject != NULL);
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;
}
//---------------------------------------------------------------------------
BOOLEAN PacketGetNetType (LPADAPTER AdapterObject,NetType *type)
{
BOOLEAN Status;
ULONG IoCtlBufferLength = (sizeof (PACKET_OID_DATA) + sizeof (ULONG) - 1);
PPACKET_OID_DATA OidData;
ODS ("Packet32: PacketSetFilter\n");
_ASSERTE (AdapterObject != NULL);
OidData = GlobalAllocPtr (
GMEM_MOVEABLE | GMEM_ZEROINIT,
IoCtlBufferLength
);
if (OidData == NULL)
{
return FALSE;
}
//get the link-layer type
OidData->Oid = OID_GEN_MEDIA_IN_USE;
OidData->Length = sizeof (ULONG);
Status = PacketRequest(AdapterObject,FALSE,OidData);
if(Status==FALSE)return FALSE;
type->LinkType=*((UINT*)OidData->Data);
//get the link-layer speed
OidData->Oid = OID_GEN_LINK_SPEED;
OidData->Length = sizeof (ULONG);
Status = PacketRequest(AdapterObject,FALSE,OidData);
type->LinkSpeed=*((UINT*)OidData->Data)*100;
GlobalFreePtr (OidData);
return Status;
}
//---------------------------------------------------------------------------
BOOLEAN PacketSetMaxLookaheadsize (LPADAPTER AdapterObject)
{
BOOLEAN Status;
ULONG IoCtlBufferLength = (sizeof (PACKET_OID_DATA) + sizeof (ULONG) - 1);
PPACKET_OID_DATA OidData;
ODS ("Packet32: PacketSetFilter\n");
_ASSERTE (AdapterObject != NULL);
OidData = GlobalAllocPtr (
GMEM_MOVEABLE | GMEM_ZEROINIT,
IoCtlBufferLength
);
if (OidData == NULL)
{
return FALSE;
}
//set the size of the lookahead buffer to the maximum available by the the NIC driver
OidData->Oid=OID_GEN_MAXIMUM_LOOKAHEAD;
OidData->Length=sizeof(ULONG);
Status=PacketRequest(AdapterObject,FALSE,OidData);
OidData->Oid=OID_GEN_CURRENT_LOOKAHEAD;
Status=PacketRequest(AdapterObject,TRUE,OidData);
GlobalFreePtr(OidData);
return Status;
}
//---------------------------------------------------------------------------
BOOLEAN StartPacketDriver (LPTSTR lpstrServiceName)
{
ODS ("Packet32: StartPacketDriver\n");
return TRUE;
}
//---------------------------------------------------------------------------
BOOLEAN StopPacketDriver(void)
{
ODS ("Packet32: StopPacketDriver\n");
return TRUE;
}
//---------------------------------------------------------------------------
INT PacketSetSnapLen(LPADAPTER AdapterObject, int snaplen)
{
ODS ("Packet32: PacketSetSnapLen\n");
return 0;
}
//---------------------------------------------------------------------------
BOOLEAN PacketGetAdapterNames (PTSTR pStr,
PULONG BufferSize)
{
ULONG Result,i;
LONG Status;
char* pStrInternal;
ULONG RemainingBytes;
LPADAPTER adapter;
PPACKET_OID_DATA OidData;
HKEY Key;
char NdisName[80];
ULONG NeededBytes;
ULONG NeededBytesForString;
char TempBuffer[1024];
BOOLEAN retVal;
OidData=GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,256);
if (OidData == NULL)
{
return FALSE;
}
Status=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\class\\net",0,KEY_READ,&Key);
if (Status != ERROR_SUCCESS)
{
GlobalFree(OidData);
return FALSE;
}
NeededBytes = 0;
//first we calculate the needed bytes
i=0;
while((Result=RegEnumKey(Key,i,NdisName,sizeof(NdisName) - sizeof("\\NDIS") - 1))==ERROR_SUCCESS)
{
HKEY hKeyNdisName;
strcat(NdisName,"\\NDIS");
Status=RegOpenKeyEx(Key,NdisName,0,KEY_READ,&hKeyNdisName);
if (Status != ERROR_SUCCESS)
{
i++;
continue;
}
//we need to tell RegOpenKeyEx the length of the buffer passed as argument
NeededBytesForString = sizeof(TempBuffer);
Status=RegQueryValueEx(hKeyNdisName,"LOGDRIVERNAME",NULL,NULL,(LPBYTE)TempBuffer,&NeededBytesForString);
if (Status != ERROR_SUCCESS)
{
RegCloseKey(hKeyNdisName);
i++;
continue;
}
NeededBytes += NeededBytesForString;
//we try to open the adapter and retrieve its name
adapter=PacketOpenAdapter(TempBuffer);
if(adapter==NULL)
{
NeededBytes += sizeof("Unknown") + 1;
}
else
{
//we retrieve its name by performing a PacketRequest,
//the buffer that will contain the name is at the end of the OidData structure
OidData->Oid = OID_GEN_VENDOR_DESCRIPTION;
OidData->Length = 256 - sizeof(PACKET_OID_DATA);
Status = PacketRequest(adapter,FALSE,OidData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -