📄 packet32.c
字号:
BOOLEAN PacketWaitPacket(LPADAPTER AdapterObject, LPPACKET lpPacket, PULONG BytesReceived)
/*++
Routine Description:
This routine waits for an overlapped IO on a packet to complete
Called if the send or receive call specified FALSE for the Sync parmeter
Arguments:
AdapterObject - AdapterObject return by PacketOpenAdapter
lpPacket - Packet object returned by PacketAllocatePacket and initialized
by PacketInitPacket
Return Value:
SUCCESS - TRUE if overlapped call succeeded
FAILURE -
--*/
{
return GetOverlappedResult(
AdapterObject->hFile,
&lpPacket->OverLapped,
BytesReceived,
TRUE);
}
BOOLEAN PacketResetAdapter(LPADAPTER AdapterObject)
/*++
Routine Description:
This rotuine resets the adapter. This will complete all pending sends receives and requests
Arguments:
AdapterObject - AdapterObject return by PacketOpenAdapter
Return Value:
SUCCESS - TRUE if overlapped call succeeded
FAILURE -
--*/
{
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)
/*++
Routine Description:
This routine sends issues a request to and adapter
Arguments:
AdapterObject - AdapterObject return by PacketOpenAdapter
Set - True means that the request is SET otherwise it is a query
OidData - Structure containing the details of the OID
Return Value:
SUCCESS -
FAILURE -
--*/
{
UINT BytesReturned;
BOOLEAN 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;
}
BOOLEAN PacketSetFilter( LPADAPTER AdapterObject, ULONG Filter)
/*++
Routine Description:
This rotine sets the adapters packet filter
Arguments:
AdapterObject - AdapterObject return by PacketOpenAdapter
Filter - filter to be set
Return Value:
SUCCESS -
FAILURE -
--*/
{
BOOLEAN 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;
}
BOOLEAN PacketQueryHardwareAddress( LPADAPTER AdapterObject, PBYTE Addr)
/*++
Routine Description:
This rotine querys the adapters hardware address
Arguments:
AdapterObject - AdapterObject return by PacketOpenAdapter
Addr - returned hardware address
Return Value:
SUCCESS -
FAILURE -
--*/
{
BOOLEAN Status;
ULONG IoCtlBufferLength=(sizeof(PACKET_OID_DATA)+6-1);
PPACKET_OID_DATA OidData;
OidData=GlobalAllocPtr(
GMEM_MOVEABLE | GMEM_ZEROINIT,
IoCtlBufferLength);
if (OidData == NULL)
{
return FALSE;
}
OidData->Oid=OID_802_3_CURRENT_ADDRESS;
OidData->Length=6;
// *((BYTE)OidData->Data)=Addr;
Status=PacketRequest(AdapterObject,FALSE,OidData);
memcpy (Addr, OidData->Data, 6);
GlobalFreePtr(OidData);
return Status;
}
BOOLEAN StartPacketDriver(LPTSTR ServiceName)
/*++
Routine Description:
This routine Atempts to start the kernel mode packet driver
Arguments:
ServiceName - Name of service to try to start
Return Value:
SUCCESS -
FAILURE -
--*/
{
BOOLEAN Status;
SC_HANDLE SCManagerHandle;
SC_HANDLE SCServiceHandle;
/* Open a handle to the SC Manager database. */
SCManagerHandle = OpenSCManager(
NULL, /* local machine */
NULL, /* ServicesActive database */
GENERIC_READ/*SC_MANAGER_ALL_ACCESS*/ );/* full access rights */
if (SCManagerHandle==NULL)
{
DWORD Errore = GetLastError();
MessageBox(NULL,TEXT("Could not open SC"),szWindowTitle,MB_OK);
return FALSE;
}
else
{
SCServiceHandle=OpenService(SCManagerHandle,
ServiceName,
SERVICE_START
//SERVICE_QUERY_STATUS
);
if (SCServiceHandle == NULL)
{
DWORD Errore = GetLastError();
MessageBox(NULL,TEXT("Could not open service"),szWindowTitle,MB_OK);
}
Status=StartService(SCServiceHandle,0,NULL);
if (!Status)
{
if (GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
{
ODS("Packet32: Packet service already started\n");
return TRUE;
}
}
return Status;
}
return FALSE;
}
ULONG PacketGetAdapterNames(PTSTR pStr,PULONG BufferSize)
/*++
Routine Description:
This routine returns the names all adapters availible
Arguments:
Pstr - Pointer to a buffer which recieves the UNICODE names
Each name is NULL terminated with a second NULL at the end
of the list.
BufferSize - Size of the buffer passed in
Return Value:
SUCCESS -
FAILURE -
--*/
{
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("Packet"),
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -