2015-09-25 41 views
2

有人可以给我提供一个示例C代码,列出可以用Createfile()打开的所有设备名称吗?我总是得到错误代码3:路径不存在,这并不作品如何发送IOCTL到Windows上的所有驱动程序C

示例代码:

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <windows.h> 
#include <regstr.h> 
#include <devioctl.h> 
#include <usb.h> 
#include <usbiodef.h> 
#include <usbioctl.h> 
#include <usbprint.h> 
#include <setupapi.h> 
#include <devguid.h> 
#include <wdmguid.h> 

#pragma comment(lib, "Setupapi.lib") 
int main(void){ 
    HDEVINFO deviceInfoList; 
    deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); 

    if (deviceInfoList != INVALID_HANDLE_VALUE) 
    { 
     SP_DEVINFO_DATA deviceInfoData; 
     deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 
     for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) 
     { 
      LPTSTR buffer = NULL; 
      DWORD buffersize = 0; 
      while (!SetupDiGetDeviceInstanceIdA(deviceInfoList, &deviceInfoData, buffer, buffersize, &buffersize)) 
      { 
       if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
       { 
        if (buffer) delete buffer; 
        buffer = new TCHAR[buffersize]; 
       } 
       else 
       { 
        printf("%ls\n", "error"); 
        break; 
       } 
      } 
      HANDLE hFile = CreateFileA(buffer, 
       GENERIC_READ, 
       0, 
       NULL, 
       OPEN_EXISTING, 
       0, 
       NULL); 

      if (hFile == INVALID_HANDLE_VALUE) { 
       printf("InvalidHandle, error code: %d\n", GetLastError()); 
      } 
      CloseHandle(hFile); 

      printf("%s\n", buffer); 
      if (buffer) { delete buffer; buffer = NULL; } 
     } 
    } 
    getchar(); 
} 

我的目标是打印所有有效的设备名称,并尝试得到一个有效的句柄,以后我可以用户发送ioctl`s

THX

编辑: OK abhineet因此多数民众赞成什么,我现在得到:

DWORD EnumerateDevices(){ 
    DWORD dwResult = 0; 

    HDEVINFO hdev = SetupDiGetClassDevs(&GUID_DEVCLASS_BATTERY, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);// DIGCF_ALLCLASSES 
    /*HDEVINFO hdev =SetupDiGetClassDevs(NULL, 
     0, // Enumerator 
     0, 
     DIGCF_PRESENT | DIGCF_ALLCLASSES); */ 
    if (INVALID_HANDLE_VALUE != hdev) { 
     for (int idev = 0; idev < 100; idev++) 
     { 
      SP_DEVICE_INTERFACE_DATA did = { 0 }; 
      did.cbSize = sizeof(did); 

      if (SetupDiEnumDeviceInterfaces(hdev, NULL, &GUID_DEVCLASS_BATTERY, idev, &did)) 
      { 
       DWORD cbRequired = 0; 

       SetupDiGetDeviceInterfaceDetail(hdev, 
        &did, 
        NULL, 
        0, 
        &cbRequired, 
        0); 
       if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) 
       { 
        PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, cbRequired); 
        if (pdidd) { 
         pdidd->cbSize = sizeof(*pdidd); 
         if (SetupDiGetDeviceInterfaceDetail(hdev, &did, pdidd, cbRequired, &cbRequired, 0)) { 
          wprintf(L"%s\n", pdidd->DevicePath); 
          HANDLE hBattery = CreateFile(pdidd->DevicePath, 
           GENERIC_READ | GENERIC_WRITE, 
           FILE_SHARE_READ | FILE_SHARE_WRITE, 
           NULL, 
           OPEN_EXISTING, 
           FILE_ATTRIBUTE_NORMAL, 
           NULL); 
          if (INVALID_HANDLE_VALUE != hBattery) 
          { 
           printf("Successfully opened Handle\n"); 
           CloseHandle(hBattery); 
          } 
          else{ 
           wprintf(L"CreateFile(%s) failed %d\n", pdidd->DevicePath, GetLastError()); 
          } 
         } 
         else{ 
          printf("SetupDiGetDeviceInterfaceDetail() failed %d\n", GetLastError()); 
         } 
         LocalFree(pdidd); 
        } 
       } 
       else{ 
        printf("SetupDiGetDeviceInterfaceDetail() failed %d\n", GetLastError()); 
       } 
      } 
      else if (ERROR_NO_MORE_ITEMS == GetLastError()) 
      { 
       printf("-NoMoreItems-"); 
       break; // Enumeration failed - perhaps we're out of items 
      } 
     } 
     SetupDiDestroyDeviceInfoList(hdev); 
    } 
    else{ 
     printf("SetupDiGetClassDevs() failed %d\n", GetLastError()); 
    } 
    return dwResult; 
} 

我撕开了最从这里:https://msdn.microsoft.com/en-us/library/windows/desktop/bb204769(v=vs.85).aspx

和我的输出是:

\\?\acpi#pnp0c0a#1#{72631e54-78a4-11d0-bcf7-00aa00b7b32a} 
Successfully opened Handle 
-NoMoreItems- 

至少我得到了一个有效的句柄! 所以我想要做到这一点在系统上可用的所有设备,如何做到这一点?

+0

嗯,你可以重复同样的过程对每个设备类。可能有一个更简单的方法;例如,尝试传递'NULL'而不是类GUID。但真的没有任何意义;如果你(至少)不知道设备类,你怎么知道IOCTLs是有效的? –

+0

@harry johnston 1.已经完成了,但是我刚刚获得-NoMoreItems- 2.蛮力,反向工程。我的目标是将ioctl发送到当前正在运行的每个.sys Driver-Service。 – test123423

+0

和btw:你不能将NULL作为ClassGuid传递给SetupDiEnumDeviceInterfaces,你可以在0x0处读取AV – test123423

回答

1

恕我直言,我不认为,你可以做一个CreateFileInstanceID。要做CreateFile,您需要设备的符号名称。您可以使用以下SetupAPIs,

两个API的备注部分指出,

SetupDiEnumDeviceInterfaces :: DeviceInterfaceData指向结构,标识请求的 设备接口。要获得有关接口的详细信息,请致电 SetupDiGetDeviceInterfaceDetail。 的详细信息,包括可传递到Win32函数 如的CreateFile(微软的Windows SDK文档中描述) 得到一个句柄接口设备接口的 名称。

SetupDiGetDeviceInterfaceDetail ::由该函数返回的接口的细节由可以被传递到的Win32作为这样的CreateFile 功能的设备路径的。不要试图解析设备路径 符号名称。设备路径可以在系统启动时重复使用。

这可能是你的使用,how to get DevicePath from DeviceID

相关问题