zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:1683回复:2

如何获取网卡的物理地址?

楼主#
更多 发布于:2008-06-02 16:34
大家好,我想在驱动中获取网卡的物理地址,不知道该怎么获取,我知道IP地址,我想知道对应IP地址的网卡的物理地址,哪位大侠能指点一下小弟吗? 谢谢先!
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-06-02 17:14
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <intsafe.h>
#include <initguid.h>
#include <ntifs.h>
#include <ndis.h>
#include <ntddk.h>
#include <ntdddisk.h>
#include <wmilib.h>
#include <wmistr.h>
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
#include <ntifs.h>

#undef ExAllocatePool
#define ExAllocatePool(type, size)  ExAllocatePoolWithTag(type, size, 'xxxx');

#define ANSI_STRING_CONST(x)        {sizeof(x)-1, sizeof(x), x}
#define UNICODE_STRING_CONST(x)        {sizeof(x)-2, sizeof(x), x}
#define __max(a,b)  (((a) > (b)) ? (a) : (b))
#define __min(a,b)  (((a) < (b)) ? (a) : (b))

#define OID_802_3_PERMANENT_ADDRESS             0x01010101
#define OID_802_3_CURRENT_ADDRESS               0x01010102

#define        DEV_DOS_ROOT    L"\\??\\"
NTSTATUS GetMacAddress(OUT PUCHAR pchBuf, IN OUT PULONG pnBufSize)
{
    NTSTATUS                status;
    HANDLE                    hAdapter = NULL;
    PKEY_FULL_INFORMATION    pKeyFullInfo = NULL;

    for(;;)
    {
//        UNICODE_STRING            ustrAdapter = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}");
        UNICODE_STRING            ustrAdapter = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters");
        OBJECT_ATTRIBUTES        ObjAttrib;
        ULONG                    nSize;
        ULONG                    nIndex;

        InitializeObjectAttributes(&ObjAttrib, &ustrAdapter, OBJ_CASE_INSENSITIVE, NULL, NULL);
        status = ZwOpenKey(&hAdapter, KEY_READ, &ObjAttrib);
        if (!NT_SUCCESS(status))
        {
            DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwOpenKey Error: %x\n", status);
            break;
        }

        ZwQueryKey(hAdapter, KeyFullInformation, NULL, 0, &nSize);
        pKeyFullInfo = (PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool, nSize);
        if (!pKeyFullInfo)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }
        ZwQueryKey(hAdapter, KeyFullInformation, pKeyFullInfo, nSize, &nSize);


        for (nIndex = 0; nIndex < pKeyFullInfo ->SubKeys; nIndex ++)
        {
            PKEY_BASIC_INFORMATION        pKeyBasicInfo = NULL;
            HANDLE                        hDev = NULL;
          
            for(;;)
            {
                UNICODE_STRING        strKeyName;
                UNICODE_STRING        ustrDev = UNICODE_STRING_CONST(DEV_DOS_ROOT L"{F6ACFAC2-D39E-4A43-A320-0CDB9E22B15B}");
                IO_STATUS_BLOCK        IoStatusBlock;
                ULONG                nOid;

                ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, NULL, 0, &nSize);
                pKeyBasicInfo = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, nSize);
                if (NULL == pKeyBasicInfo)
                {
                    status = STATUS_INSUFFICIENT_RESOURCES;
                    break;
                }
                ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, pKeyBasicInfo, nSize, &nSize);
              

                strKeyName.Buffer = pKeyBasicInfo ->Name;
                strKeyName.MaximumLength = (USHORT)pKeyBasicInfo ->NameLength;
                strKeyName.Length = (USHORT)pKeyBasicInfo ->NameLength;
              
                ustrDev.Length = sizeof(DEV_DOS_ROOT) - 2;
                status = RtlAppendUnicodeStringToString(&ustrDev, &strKeyName);
                if (STATUS_SUCCESS != status)
                {
                    DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"RtlAppendUnicodeStringToString Error: %x\n", status);
                    break;
                }

                InitializeObjectAttributes(&ObjAttrib, &ustrDev, OBJ_CASE_INSENSITIVE, NULL, NULL);
                status = ZwOpenFile(&hDev,
                    GENERIC_READ,
                    &ObjAttrib,
                    &IoStatusBlock,
                    FILE_SHARE_READ,
                    FILE_NON_DIRECTORY_FILE);
                if (STATUS_SUCCESS != status)
                {
                    DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwOpenFile Error: %x\n", status);
                  
                    break;
                }
                DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwOpenFile Success: %x\n", status);
              
                nOid = OID_GEN_MEDIA_IN_USE;
                status = ZwDeviceIoControlFile(hDev,
                    NULL,
                    NULL,
                    NULL,
                    &IoStatusBlock,
                    IOCTL_NDIS_QUERY_GLOBAL_STATS,
                    &nOid,
                    sizeof(nOid),
                    pchBuf,
                    *pnBufSize);
                if (STATUS_SUCCESS != status)
                {
                    DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwDeviceIoControlFile OID_GEN_MEDIA_IN_USE Error: %x\n", status);
                  
                    break;
                }
                DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"OID_GEN_MEDIA_IN_USE: %04x\n", *(ULONG*)pchBuf);

                nOid = OID_802_3_PERMANENT_ADDRESS;
                status = ZwDeviceIoControlFile(hDev,
                    NULL,
                    NULL,
                    NULL,
                    &IoStatusBlock,
                    IOCTL_NDIS_QUERY_GLOBAL_STATS,
                    &nOid,
                    sizeof(nOid),
                    pchBuf,
                    *pnBufSize);
                if (STATUS_SUCCESS != status)
                {
                    DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwDeviceIoControlFile OID_802_3_PERMANENT_ADDRESS Error: %x\n", status);
                  
                    break;
                }

                DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"Mac: %02x:%02x:%02x:%02x:%02x:%02x\n", pchBuf[0], pchBuf[1], pchBuf[2], pchBuf[3], pchBuf[4], pchBuf[5]);
              

                *pnBufSize = PtrToUlong(IoStatusBlock.Information);
                break;
            }

            if (hDev)
            {
                ZwClose(hDev);
            }
          
            if (pKeyBasicInfo)
            {
                ExFreePool(pKeyBasicInfo);
            }

            if (STATUS_SUCCESS == status)
            {
              
//                break;
            }
        }

        break;
    }

    if (pKeyFullInfo)
    {
        ExFreePool(pKeyFullInfo);
    }

    if (hAdapter)
    {
        ZwClose(hAdapter);
    }


    return status;
}


VOID DriverUnload (
                  __in PDRIVER_OBJECT DriverObject
                  )
{
}


NTSTATUS DriverEntry(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS            status;

    UCHAR                pchBuf[256];
    ULONG                nBufLen = 256;

    status = GetMacAddress(pchBuf, &nBufLen);
    if (STATUS_SUCCESS == status)
    {

    }

    DriverObject->DriverUnload = DriverUnload;

    return STATUS_SUCCESS;
}
好好学习,天天向上! root60931@gmail.com
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-02 17:49
哈哈,太感谢大侠了,对大侠的感谢之情如滔滔江水!bow~
游客

返回顶部