initial commit
[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 devinfo;\r
15         SP_DEVICE_INTERFACE_DATA devif;\r
16         SP_DEVICE_INTERFACE_DETAIL_DATA_A *devdetail;\r
17         DWORD detsz;\r
18 \r
19         if((devset = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,\r
20                                         DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) == INVALID_HANDLE_VALUE) {\r
21                 fprintf(stderr, "failed to enumerate devices\n");\r
22                 return 1;\r
23         }\r
24 \r
25         devidx = 0;\r
26         for(;;) {\r
27                 memset(&devinfo, 0, sizeof devinfo);\r
28                 devinfo.cbSize = sizeof devinfo;\r
29                 if(!SetupDiEnumDeviceInfo(devset, devidx, &devinfo)) {\r
30                         if(GetLastError() == ERROR_NO_MORE_ITEMS) {\r
31                                 printf("no such device: %d\n", devidx);\r
32                                 break;\r
33                         }\r
34                         devidx++;\r
35                         continue;\r
36                 }\r
37 \r
38                 printf("device %d:\n", devidx);\r
39                 ifidx = 0;\r
40                 for(;;) {\r
41                         memset(&devif, 0, sizeof devif);\r
42                         devif.cbSize = sizeof devif;\r
43                         if(!SetupDiEnumDeviceInterfaces(devset, &devinfo, &GUID_DEVINTERFACE_DISK, ifidx, &devif)) {\r
44                                 if(GetLastError() == ERROR_NO_MORE_ITEMS) {\r
45                                         printf("no such interface: %d\n", ifidx);\r
46                                         break;\r
47                                 }\r
48                                 ifidx++;\r
49                                 continue;\r
50                         }\r
51 \r
52                         SetupDiGetDeviceInterfaceDetail(devset, &devif, 0, 0, &detsz, 0);\r
53                         if(!(devdetail = malloc(detsz))) {\r
54                                 fprintf(stderr, "failed to allocate device interface detail buffer (size: %lu)\n", (unsigned long)detsz);\r
55                                 return 1;\r
56                         }\r
57                         devdetail->cbSize = detsz;\r
58                         SetupDiGetDeviceInterfaceDetail(devset, &devif, devdetail, detsz, 0, 0);\r
59                         printf("device %d.%d path: %s\n", devidx, ifidx, devdetail->DevicePath);\r
60                         free(devdetail);\r
61 \r
62                         ifidx++;\r
63                 }\r
64                 printf("found %d interfaces\n", ifidx);\r
65                 devidx++;\r
66         }\r
67 \r
68         printf("found %d devices\n", devidx);\r
69         return 0;\r
70 }\r