friendly names
[rawdisktest] / src / main.c
index ab6d6ae..c1da2d9 100644 (file)
@@ -9,11 +9,14 @@
 \r
 int main(int argc, char **argv)\r
 {\r
-       int ifidx;\r
+       int devidx, ifidx;\r
        HDEVINFO devset;\r
+       SP_DEVINFO_DATA devdata;\r
        SP_DEVICE_INTERFACE_DATA devif;\r
        SP_DEVICE_INTERFACE_DETAIL_DATA_A *devdetail;\r
-       DWORD detsz;\r
+       DWORD size;\r
+       DWORD regtype;\r
+       char devname[1024];\r
 \r
        if((devset = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,\r
                                        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) == INVALID_HANDLE_VALUE) {\r
@@ -21,28 +24,47 @@ int main(int argc, char **argv)
                return 1;\r
        }\r
 \r
-       ifidx = 0;\r
+       devidx = 0;\r
        for(;;) {\r
-               memset(&devif, 0, sizeof devif);\r
-               devif.cbSize = sizeof devif;\r
-               if(!SetupDiEnumDeviceInterfaces(devset, 0, &GUID_DEVINTERFACE_DISK, ifidx, &devif)) {\r
+               memset(&devdata, 0, sizeof devdata);\r
+               devdata.cbSize = sizeof devdata;\r
+               if(!SetupDiEnumDeviceInfo(devset, devidx, &devdata)) {\r
                        if(GetLastError() == ERROR_NO_MORE_ITEMS) break;\r
-                       ifidx++;\r
+                       devidx++;\r
                        continue;\r
                }\r
 \r
-               SetupDiGetDeviceInterfaceDetail(devset, &devif, 0, 0, &detsz, 0);\r
-               if(!(devdetail = malloc(detsz))) {\r
-                       fprintf(stderr, "failed to allocate device interface detail buffer (size: %lu)\n", (unsigned long)detsz);\r
-                       return 1;\r
+               regtype = SPDRP_PHYSICAL_DEVICE_OBJECT_NAME;\r
+               SetupDiGetDeviceRegistryProperty(devset, &devdata, SPDRP_FRIENDLYNAME,\r
+                               &regtype, (unsigned char*)devname, sizeof devname, &size);\r
+\r
+               printf("Device %d: %s\n", devidx, devname);\r
+\r
+               ifidx = 0;\r
+               for(;;) {\r
+                       memset(&devif, 0, sizeof devif);\r
+                       devif.cbSize = sizeof devif;\r
+                       if(!SetupDiEnumDeviceInterfaces(devset, &devdata, &GUID_DEVINTERFACE_DISK, ifidx, &devif)) {\r
+                               if(GetLastError() == ERROR_NO_MORE_ITEMS) break;\r
+                               ifidx++;\r
+                               continue;\r
+                       }\r
+\r
+                       SetupDiGetDeviceInterfaceDetail(devset, &devif, 0, 0, &size, 0);\r
+                       if(!(devdetail = malloc(size))) {\r
+                               fprintf(stderr, "failed to allocate device interface detail buffer (size: %lu)\n", (unsigned long)size);\r
+                               return 1;\r
+                       }\r
+                       devdetail->cbSize = sizeof *devdetail;\r
+                       SetupDiGetDeviceInterfaceDetail(devset, &devif, devdetail, size, 0, 0);\r
+                       printf("  path: %s\n", devdetail->DevicePath);\r
+                       free(devdetail);\r
+\r
+                       ifidx++;\r
                }\r
-               devdetail->cbSize = sizeof *devdetail;\r
-               SetupDiGetDeviceInterfaceDetail(devset, &devif, devdetail, detsz, 0, 0);\r
-               printf("device path: %s\n", devdetail->DevicePath);\r
-               free(devdetail);\r
 \r
-               ifidx++;\r
+               devidx++;\r
+               printf("found %d devices\n", devidx);\r
        }\r
-       printf("found %d devices\n", ifidx);\r
        return 0;\r
 }\r