Advertisement
Protagores

SetupDiTest.c

Jul 13th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <Windows.h>
  4. #include <SetupAPI.h>
  5.  
  6. static int get_interface(HDEVINFO);
  7. static int get_detail(HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD);
  8. static int get_instance(HDEVINFO, PSP_DEVINFO_DATA, PSTR, DWORD, PSP_DEVICE_INTERFACE_DETAIL_DATA_A);
  9.  
  10. int main()
  11. {
  12.     HDEVINFO devInfoSet = SetupDiGetClassDevsA(NULL, "USBSTOR", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
  13.     if (devInfoSet == INVALID_HANDLE_VALUE)
  14.     {
  15.         fprintf(stderr, "SetupDiGetClassDevsA: Error %lu\n", GetLastError());
  16.         return 1;
  17.     }
  18.  
  19.     int ret = get_interface(devInfoSet);
  20.  
  21.     SetupDiDestroyDeviceInfoList(devInfoSet);
  22.     return ret;
  23. }
  24.  
  25. int get_interface(HDEVINFO devInfoSet)
  26. {
  27.     SP_DEVICE_INTERFACE_DATA devIface = { sizeof(SP_DEVICE_INTERFACE_DATA) };
  28.     if (!SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &GUID_DEVINTERFACE_DISK, 0, &devIface))
  29.     {
  30.         fprintf(stderr, "SetupDiEnumDeviceInterfaces: Error %lu\n", GetLastError());
  31.         return 1;
  32.     }
  33.  
  34.     DWORD sDevIfaceDetail;
  35.     SetupDiGetDeviceInterfaceDetailA(devInfoSet, &devIface, NULL, 0, &sDevIfaceDetail, NULL);
  36.  
  37.     PSP_DEVICE_INTERFACE_DETAIL_DATA_A pDevIfaceDetail = malloc(sDevIfaceDetail);
  38.     if (!pDevIfaceDetail)
  39.     {
  40.         fputs("malloc: Out of memory.\n", stderr);
  41.         return 1;
  42.     }
  43.  
  44.     pDevIfaceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
  45.     int ret = get_detail(devInfoSet, &devIface, pDevIfaceDetail, sDevIfaceDetail);
  46.  
  47.     free(pDevIfaceDetail);
  48.     return ret;
  49. }
  50.  
  51. int get_detail(HDEVINFO devInfoSet, PSP_DEVICE_INTERFACE_DATA pDevIface, PSP_DEVICE_INTERFACE_DETAIL_DATA_A pDevIfaceDetail, DWORD sDevIfaceDetail)
  52. {
  53.     SP_DEVINFO_DATA devInfo = { sizeof(SP_DEVINFO_DATA) };
  54.     if (!SetupDiGetDeviceInterfaceDetailA(devInfoSet, pDevIface, pDevIfaceDetail, sDevIfaceDetail, NULL, &devInfo))
  55.     {
  56.         fprintf(stderr, "SetupDiGetDeviceInterfaceDetailA: Error %lu\n", GetLastError());
  57.         return 1;
  58.     }
  59.  
  60.     DWORD sDevIfaceId;
  61.     SetupDiGetDeviceInstanceIdA(devInfoSet, &devInfo, NULL, 0, &sDevIfaceId);
  62.  
  63.     PSTR pDevIfaceId = calloc(sDevIfaceId, sizeof(CHAR));
  64.     if (!pDevIfaceId)
  65.     {
  66.         fputs("calloc: Out of memory.\n", stderr);
  67.         return 1;
  68.     }
  69.  
  70.     int ret = get_instance(devInfoSet, &devInfo, pDevIfaceId, sDevIfaceId, pDevIfaceDetail);
  71.  
  72.     free(pDevIfaceId);
  73.     return ret;
  74. }
  75.  
  76. int get_instance(HDEVINFO devInfoSet, PSP_DEVINFO_DATA pdevInfo, PSTR pDevIfaceId, DWORD sDevIfaceId, PSP_DEVICE_INTERFACE_DETAIL_DATA_A pDevIfaceDetail)
  77. {
  78.     if (!SetupDiGetDeviceInstanceIdA(devInfoSet, pdevInfo, pDevIfaceId, sDevIfaceId, NULL))
  79.     {
  80.         fprintf(stderr, "SetupDiGetDeviceInstanceIdA: Error %lu\n", GetLastError());
  81.         return 1;
  82.     }
  83.  
  84.     printf("Device instance id: %s\nDevice path: %s\n", pDevIfaceId, pDevIfaceDetail->DevicePath);
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement