⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packet32.c

📁 3 网卡驱动相关实例 这是和网卡NT KMD驱动程序有关的一些资料和例子。
💻 C
📖 第 1 页 / 共 2 页
字号:

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 + -