【问题标题】:I'm trying to retrieve the serial number of a hard drive or a battery tag我正在尝试检索硬盘驱动器或电池标签的序列号
【发布时间】:2017-05-04 13:19:48
【问题描述】:
#include "stdafx.h"
#include <stdio.h> 
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <process.h>
#include <WinIoCtl.h>
#include <Winbase.h>

typedef struct _MEDIA_SERIAL_NUMBER_DATA {  
      ULONG SerialNumberLength;
      ULONG Result;
      ULONG Retreived;
      DWORD SerialNumberData[];
} MEDIA_SERIAL_NUMBER_DATA, *PMEDIA_SERIAL_NUMBER_DATA;  // the structure of IOCTL_MEDIA_SERIAL_NUMBER_DATA 

int main() {
    HANDLE hard;
    bool result;
    MEDIA_SERIAL_NUMBER_DATA  val;  
    char buf[sizeof(MEDIA_SERIAL_NUMBER_DATA)];
    MEDIA_SERIAL_NUMBER_DATA * p = (MEDIA_SERIAL_NUMBER_DATA *) buf;

    hard = CreateFile(L"\\\\.\\C:", 0, FILE_SHARE_WRITE, NULL,    OPEN_EXISTING, 0, 0);
    result = DeviceIoControl(hard, IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,    NULL, 0, buf, sizeof buf, 0, NULL);

   if (hard == INVALID_HANDLE_VALUE) 
       printf("Terminal error : invalid handle value \n");

   printf("valeur Handle : %c \n", hard);
   printf("valeur retour :    %d \n", result);
   printf("valeur serial : %d \n",    p->SerialNumberData);     
   printf("valeur longeur num serie : %d \n",    p->SerialNumberLength); 

   CloseHandle(hard); // free the Handle    
   system("pause");
   return 0;
}

当我编译并执行这段代码时,我得到以下结果:

valeur Handle : D
valeur retour : 0
valeur serial : 15530164     
valeur longeur num serie : -858993460

【问题讨论】:

  • 1) 正确缩进你的代码。目前它是 - 不可读。 2)将您获得的输出复制到问题中,而不是向其提供图像。 3) 无论如何我们都无法理解您的输出,请用英文提供。 4)你没看问题预览吗?它在那里,是有原因的。
  • 如果你使用 C++ 流 I/O,你会遇到更少的类型问题。
  • @molbdnilo:您无法使用 C++ I/O 流发送设备 IO 控制代码。通常是个好建议,但在这种情况下肯定不是。
  • @IInspectable 我指的是printfs。
  • @IInspectable 我认为问题出在指针上,返回了序列号但序列号的大小没有

标签: c++ windows createfile deviceiocontrol


【解决方案1】:

考虑阅读一些文档。

  1. 几乎所有printfs 都使用了错误的格式字符串。
  2. 您的结构不是DeviceIoControlIOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER 返回的结构。
  3. 如果lpOverlappedNULL,则lpBytesReturned 不能是NULL
  4. IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER 检索 USB 设备的序列号
  5. DeviceIoControl 的返回值为零表示失败。

【讨论】:

  • hhmmm 好的,我现在明白了,谢谢回答
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2010-10-09
  • 2015-07-05
  • 2011-02-07
相关资源
最近更新 更多