📄 packet32.c
字号:
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;
}
//---------------------------------------------------------------------------
BOOLEAN PacketGetAdapterNames (PTSTR pStr,
PULONG BufferSize)
{
ULONG Result,i;
LONG Status;
char *TpStr;
char *TTpStr,*DpStr;
LPADAPTER adapter;
PPACKET_OID_DATA OidData;
HKEY Key,Key1;
ULONG BSize;
ULONG dim;
char NdisName[32];
OidData=GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,256);
if (OidData == NULL) {
return FALSE;
}
Status=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM",0,KEY_READ,&Key);
Status=RegOpenKeyEx(Key,"CurrentControlSet",0,KEY_READ,&Key);
Status=RegOpenKeyEx(Key,"Services",0,KEY_READ,&Key);
Status=RegOpenKeyEx(Key,"class",0,KEY_READ,&Key);
Status=RegOpenKeyEx(Key,"net",0,KEY_READ,&Key);
if (Status != ERROR_SUCCESS) return FALSE;
TpStr=pStr;
BSize=*BufferSize;
i=0;
while((Result=RegEnumKey(Key,i,NdisName,32))==ERROR_SUCCESS)
{
Status=RegOpenKeyEx(Key,NdisName,0,KEY_READ,&Key1);
Status=RegOpenKeyEx(Key1,"NDIS",0,KEY_READ,&Key1);
dim=BSize;
Status=RegQueryValueEx(Key1,"LOGDRIVERNAME",NULL,NULL,(LPBYTE)TpStr,&dim);
i++;
if(Status!=ERROR_SUCCESS) continue;
BSize-=dim;
TpStr+=dim;
}
TpStr[0]=0;
*BufferSize-=BSize;
if(Result==259){ //259 means OK
i=0;
(*BufferSize)++;
TpStr=pStr;
DpStr=pStr+*BufferSize;
while(*TpStr!=0){
ODSEx("Found adapter: %s\n", TpStr);
adapter=PacketOpenAdapter(TpStr);
if(adapter==NULL){
strcpy(DpStr,"Unknown");
DpStr+=7;
*DpStr++=0;
while(*TpStr!=0){
TpStr++;
}
TpStr++;
continue;
}
OidData->Oid = OID_GEN_VENDOR_DESCRIPTION;
OidData->Length = 256;
Status = PacketRequest(adapter,FALSE,OidData);
if(Status==0){
strcpy(DpStr,"Unknown");
ODSEx("Adapter description: %s\n", DpStr);
DpStr+=7;
*DpStr++=0;
while(*TpStr!=0){
TpStr++;
}
TpStr++;
continue;
}
TTpStr=(char*)(OidData->Data);
ODSEx("Adapter description: %s\n", TTpStr);
while(*TTpStr!=0){
*DpStr++=*TTpStr++;
}
*DpStr++=*TTpStr++;
PacketCloseAdapter(adapter);
while(*TpStr!=0){
TpStr++;
}
TpStr++;
}
*DpStr=0;
return TRUE;
}
return FALSE;
}
//---------------------------------------------------------------------------
BOOLEAN PacketGetNetInfo(LPTSTR AdapterName, PULONG netp, PULONG maskp)
{
struct hostent* h;
char szBuff[80];
if(gethostname(szBuff, 79))
{
if(WSAGetLastError()==WSANOTINITIALISED){
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1);
if(WSAStartup( wVersionRequested, &wsaData )!=0) return FALSE;
if(gethostname(szBuff, 79))
{
return FALSE;
}
h=gethostbyname(szBuff);
*netp=((h->h_addr_list[0][0]<<24))+
((h->h_addr_list[0][1]<<16))+
((h->h_addr_list[0][2]<<8))+
((h->h_addr_list[0][3]));
if (((*netp)&0x80000000)==0) *maskp=0xFF000000;
else if (((*netp)&0xC0000000)==0x80000000) *maskp=0xFFFF0000;
else if (((*netp)&0xE0000000)==0xC0000000) *maskp=0xFFFFFF00;
else return FALSE;
(*netp)&=*maskp;
return TRUE;
}
else
{
return FALSE;
}
}
h=gethostbyname(szBuff);
*netp=((h->h_addr_list[0][0]<<24))+
((h->h_addr_list[0][1]<<16))+
((h->h_addr_list[0][2]<<8))+
((h->h_addr_list[0][3]));
if (((*netp)&0x80000000)==0) *maskp=0xFF000000;
else if (((*netp)&0xC0000000)==0x80000000) *maskp=0xFFFF0000;
else if (((*netp)&0xE0000000)==0xC0000000) *maskp=0xFFFFFF00;
else return FALSE;
(*netp)&=*maskp;
return TRUE;
}
//---------------------------------------------------------------------------
/* Convert a ASCII dotted-quad to a 32-bit IP address.
Doesn't check to make sure it's valid. */
ULONG inet_addrU(const char *cp)
{
ULONG val, part;
WCHAR c;
int i;
val = 0;
for (i = 0; i < 4; i++) {
part = 0;
while ((c = *cp++) != '\0' && c != '.' && c != ',') {
if (c < '0' || c > '9')
return -1;
part = part*10 + (c - '0');
}
if (part > 255)
return -1;
val = val | (part << i*8);
if (i == 3) {
if (c != '\0' && c != ',')
return -1; // extra gunk at end of string
} else {
if (c == '\0' || c == ',')
return -1; // string ends early
}
}
return val;
}
//---------------------------------------------------------------------------
BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterName, npf_if_addr* buffer, PLONG NEntries)
{
HKEY InterfaceKey,CycleKey,NdisKey;
LONG status;
TCHAR String[1024+1];
DWORD RegType;
ULONG BufLen;
struct sockaddr_in *TmpAddr, *TmpBroad;
LONG naddrs,nmasks;
ULONG StringPos;
char CurAdapName[256];
char NdisName[256];
ULONG IIndex;
ULONG Result;
// Reach the class\net registry key
status=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\class\\net",0,KEY_READ,&InterfaceKey);
if (status != ERROR_SUCCESS) return FALSE;
// Scan the subkeys to determine the index of the current adapter
IIndex=0;
while((Result=RegEnumKey(InterfaceKey,IIndex,NdisName,sizeof NdisName))==ERROR_SUCCESS)
{
status=RegOpenKeyEx(InterfaceKey,NdisName,0,KEY_READ,&CycleKey);
status=RegOpenKeyEx(CycleKey,"NDIS",0,KEY_READ,&NdisKey);
BufLen=256;
status=RegQueryValueEx(NdisKey,"LOGDRIVERNAME",NULL,NULL,CurAdapName,&BufLen);
RegCloseKey(CycleKey);
RegCloseKey(NdisKey);
if(!strcmp(AdapterName, CurAdapName))
break;
IIndex++;
}
RegCloseKey(InterfaceKey);
// Reach the Enum\Network\MSTCP registry key and open the key at position IIndex
status=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Enum\\Network\\MSTCP",0,KEY_READ,&InterfaceKey);
status=RegEnumKey(InterfaceKey,IIndex,NdisName,sizeof NdisName);
status=RegOpenKeyEx(InterfaceKey,NdisName,0,KEY_READ,&CycleKey);
if (status != ERROR_SUCCESS) return FALSE;
BufLen=sizeof NdisName;
status=RegQueryValueEx(CycleKey,"Driver",NULL,NULL,NdisName,&BufLen);
RegCloseKey(InterfaceKey);
RegCloseKey(CycleKey);
// Now go to the just obtained NetTrans Entry
status=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\class",0,KEY_READ,&InterfaceKey);
status=RegOpenKeyEx(InterfaceKey,NdisName,0,KEY_READ,&CycleKey);
if (status != ERROR_SUCCESS) return FALSE;
BufLen = sizeof String;
// Open the key with the addresses
status = RegQueryValueEx(CycleKey,"IPAddress",NULL,&RegType,String,&BufLen);
if (status != ERROR_SUCCESS){
RegCloseKey(InterfaceKey);
RegCloseKey(CycleKey);
return FALSE;
}
// scan the key to obtain the addresses
StringPos = 0;
for(naddrs = 0;naddrs < *NEntries;naddrs++){
TmpAddr = (struct sockaddr_in *) &(buffer[naddrs].IPAddress);
if((TmpAddr->sin_addr.S_un.S_addr = inet_addrU(String + StringPos))!= -1){
TmpAddr->sin_family = AF_INET;
TmpBroad = (struct sockaddr_in *) &(buffer[naddrs].Broadcast);
TmpBroad->sin_family = AF_INET;
// Don't know where to find the broadcast adrr under Win9x, default to 255.255.255.255
TmpBroad->sin_addr.S_un.S_addr = 0xffffffff;
while(*(String + StringPos) != '\0' && *(String + StringPos) != ',')StringPos++;
StringPos++;
if(*(String + StringPos) == 0 || StringPos >= BufLen)
break;
}
else break;
}
BufLen = sizeof String;
// Open the key with the addresses
status = RegQueryValueEx(CycleKey,"IPMask",NULL,&RegType,String,&BufLen);
if (status != ERROR_SUCCESS){
RegCloseKey(InterfaceKey);
RegCloseKey(CycleKey);
return FALSE;
}
// scan the key to obtain the masks
StringPos = 0;
for(nmasks = 0;nmasks <* NEntries;nmasks++){
TmpAddr = (struct sockaddr_in *) &(buffer[nmasks].SubnetMask);
if((TmpAddr->sin_addr.S_un.S_addr = inet_addrU(String + StringPos))!= -1){
TmpAddr->sin_family = AF_INET;
while(*(String + StringPos) != '\0' && *(String + StringPos) != ',')StringPos++;
StringPos++;
if(*(String + StringPos) == 0 || StringPos >= BufLen)
break;
}
else break;
}
RegCloseKey(InterfaceKey);
RegCloseKey(CycleKey);
// The number of masks MUST be equal to the number of adresses
if(nmasks != naddrs){
return FALSE;
}
*NEntries = naddrs + 1;
return TRUE;
}
// not supported in Win9x
BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void *name, int len)
{
return FALSE;
}
// not supported in Win9x
BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks)
{
return FALSE;
}
// not supported in Win9x
BOOLEAN PacketIsDumpEnded(LPADAPTER AdapterObject, BOOLEAN sync)
{
return FALSE;
}
//---------------------------------------------------------------------------
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -