想给程序加个注册功能,哪位高手能给小弟我读网卡真实MAC地址的代码,多谢
想给程序加个注册功能,谁能给我读网卡真实MAC地址的代码,谢谢! - C++ Builder / Windows SDK/API
本来打算用硬盘序列号的,结果发现有些硬盘是没序列号的,又想用CUPID,结果有些CUP也没有ID,有些同一批生产的CUP的资料都一样!没办法,只能用网卡的MAC地址了,虽然MAC也能改,不过加密这东西只是防君子不防小人的.那位大侠有相应的代码就麻烦给我一下.
------解决方案--------------------
参考:http://topic.csdn.net/u/20090211/09/121aac4a-a30b-44e5-a44e-232dfb6d5215.html
------解决方案--------------------
本来打算用硬盘序列号的,结果发现有些硬盘是没序列号的,又想用CUPID,结果有些CUP也没有ID,有些同一批生产的CUP的资料都一样!没办法,只能用网卡的MAC地址了,虽然MAC也能改,不过加密这东西只是防君子不防小人的.那位大侠有相应的代码就麻烦给我一下.
------解决方案--------------------
参考:http://topic.csdn.net/u/20090211/09/121aac4a-a30b-44e5-a44e-232dfb6d5215.html
------解决方案--------------------
- Delphi(Pascal) code
function GetNetCardMac(NetCardName: string; Current: Boolean): string; inline; const OID_802_3_PERMANENT_ADDRESS: Integer = $01010101; OID_802_3_CURRENT_ADDRESS: Integer = $01010102; IOCTL_NDIS_QUERY_GLOBAL_STATS: Integer = $00170002; var hDevice: THandle; inBuf: Integer; outBuf: array[1..256] of Byte; BytesReturned: DWORD; MacAddr: string; i: integer; begin if Current then inBuf := OID_802_3_CURRENT_ADDRESS else inBuf := OID_802_3_PERMANENT_ADDRESS; hDevice := 0; Result := ''; try hDevice := CreateFile(PChar('\\.\' + NetCardName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin if DeviceIoControl(hDevice, IOCTL_NDIS_QUERY_GLOBAL_STATS, @inBuf, 4, @outBuf, 256, BytesReturned, nil) then begin MacAddr := ''; for i := 1 to BytesReturned do begin MacAddr := MacAddr + IntToHex(outbuf[i], 2); end; Result := MacAddr; end; end; finally if not hDevice <> INVALID_HANDLE_VALUE then CloseHandle(hDevice); end; end; function GetNetCardVendor(NetCardName: string): string; inline; const OID_GEN_VENDOR_DESCRIPTION : Integer = $0001010D; IOCTL_NDIS_QUERY_GLOBAL_STATS: Integer = $00170002; var hDevice: THandle; inBuf: Integer; outBuf: array[1..256] of AnsiChar; BytesReturned: DWORD; begin inBuf := OID_GEN_VENDOR_DESCRIPTION; hDevice := 0; Result := ''; try hDevice := CreateFile(PChar('\\.\' + NetCardName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin if DeviceIoControl(hDevice, IOCTL_NDIS_QUERY_GLOBAL_STATS, @inBuf, 4, @outBuf, 256, BytesReturned, nil) then Result := string(AnsiString(outBuf)); end; finally if not hDevice <> INVALID_HANDLE_VALUE then CloseHandle(hDevice); end; end; procedure TMainForm.GetMacClick(Sender: TObject); const REG_NWC = '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards'; var NetWorkCards: TStringList; ServiceName: string; i: Integer; begin Memo.Clear; with TRegistry.Create do begin RootKey := HKEY_LOCAL_MACHINE; NetWorkCards := TStringList.Create; try if OpenKeyReadOnly(REG_NWC) then GetKeyNames(NetWorkCards); for i := 0 to NetWorkCards.Count - 1 do begin if OpenKeyReadOnly(REG_NWC + '\' + NetWorkCards[i]) then begin ServiceName := ReadString('ServiceName'); Memo.Lines.Add('描述: ' + ReadString('Description')); Memo.Lines.Add('永久地址: ' + GetNetCardMac(ServiceName, False)); Memo.Lines.Add('当前地址: ' + GetNetCardMac(ServiceName, True)); Memo.Lines.Add('厂商: ' + GetNetCardVendor(ServiceName)); Memo.Lines.Add(''); Memo.Lines.Add(''); Memo.Lines.Add(''); end; end; finally NetWorkCards.Free; end; end; end;