阅读:1683回复:2
如何获取网卡的物理地址?
大家好,我想在驱动中获取网卡的物理地址,不知道该怎么获取,我知道IP地址,我想知道对应IP地址的网卡的物理地址,哪位大侠能指点一下小弟吗? 谢谢先!
|
|
沙发#
发布于: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; } |
|
|
板凳#
发布于:2008-06-02 17:49
哈哈,太感谢大侠了,对大侠的感谢之情如滔滔江水!bow~
|
|