friendly names
[rawdisktest] / src / main.c
1 #include <stdio.h>\r
2 #include <stdlib.h>\r
3 #include <string.h>\r
4 #include <windows.h>\r
5 #include <setupapi.h>\r
6 #include <devguid.h>\r
7 #include <ntddstor.h>\r
8 #include <winioctl.h>\r
9 \r
10 int main(int argc, char **argv)\r
11 {\r
12         int devidx, ifidx;\r
13         HDEVINFO devset;\r
14         SP_DEVINFO_DATA devdata;\r
15         SP_DEVICE_INTERFACE_DATA devif;\r
16         SP_DEVICE_INTERFACE_DETAIL_DATA_A *devdetail;\r
17         DWORD size;\r
18         DWORD regtype;\r
19         char devname[1024];\r
20 \r
21         if((devset = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,\r
22                                         DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) == INVALID_HANDLE_VALUE) {\r
23                 fprintf(stderr, "failed to enumerate devices\n");\r
24                 return 1;\r
25         }\r
26 \r
27         devidx = 0;\r
28         for(;;) {\r
29                 memset(&devdata, 0, sizeof devdata);\r
30                 devdata.cbSize = sizeof devdata;\r
31                 if(!SetupDiEnumDeviceInfo(devset, devidx, &devdata)) {\r
32                         if(GetLastError() == ERROR_NO_MORE_ITEMS) break;\r
33                         devidx++;\r
34                         continue;\r
35                 }\r
36 \r
37                 regtype = SPDRP_PHYSICAL_DEVICE_OBJECT_NAME;\r
38                 SetupDiGetDeviceRegistryProperty(devset, &devdata, SPDRP_FRIENDLYNAME,\r
39                                 &regtype, (unsigned char*)devname, sizeof devname, &size);\r
40 \r
41                 printf("Device %d: %s\n", devidx, devname);\r
42 \r
43                 ifidx = 0;\r
44                 for(;;) {\r
45                         memset(&devif, 0, sizeof devif);\r
46                         devif.cbSize = sizeof devif;\r
47                         if(!SetupDiEnumDeviceInterfaces(devset, &devdata, &GUID_DEVINTERFACE_DISK, ifidx, &devif)) {\r
48                                 if(GetLastError() == ERROR_NO_MORE_ITEMS) break;\r
49                                 ifidx++;\r
50                                 continue;\r
51                         }\r
52 \r
53                         SetupDiGetDeviceInterfaceDetail(devset, &devif, 0, 0, &size, 0);\r
54                         if(!(devdetail = malloc(size))) {\r
55                                 fprintf(stderr, "failed to allocate device interface detail buffer (size: %lu)\n", (unsigned long)size);\r
56                                 return 1;\r
57                         }\r
58                         devdetail->cbSize = sizeof *devdetail;\r
59                         SetupDiGetDeviceInterfaceDetail(devset, &devif, devdetail, size, 0, 0);\r
60                         printf("  path: %s\n", devdetail->DevicePath);\r
61                         free(devdetail);\r
62 \r
63                         ifidx++;\r
64                 }\r
65 \r
66                 devidx++;\r
67                 printf("found %d devices\n", devidx);\r
68         }\r
69         return 0;\r
70 }\r