2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for DeviceIoControl
5 * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org>
18 #define ok_type(condition, format, ...) ok(condition, "(%d): " format, DriveType, ##__VA_ARGS__)
19 #define skip_type(format, ...) skip("(%d): " format, DriveType, ##__VA_ARGS__)
31 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY
, NULL
, 0, &DG
, sizeof(DG
) - 1, &Size
, NULL
);
32 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
33 Error
= GetLastError();
34 ok_type(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
35 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
38 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY
, NULL
, 0, &DG
, sizeof(DG
), &Size
, NULL
);
39 /* Specific for CDROM, no disk present */
40 if (Ret
== 0 && GetLastError() == ERROR_NOT_READY
)
42 skip_type("No CDROM present\n");
45 ok_type(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
46 ok_type(Size
== sizeof(DG
), "Invalid output size: %ld\n", Size
);
49 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
) - 1, &Size
, NULL
);
50 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
51 Error
= GetLastError();
52 ok_type(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
53 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
56 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
), &Size
, NULL
);
57 ok_type(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
58 ok_type(Size
== FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
), "Invalid output size: %ld\n", Size
);
61 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, sizeof(DGE
), &Size
, NULL
);
62 ok_type(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
63 if (DriveType
== DRIVE_FIXED
)
65 ok_type(Size
== sizeof(DGE
), "Invalid output size: %ld\n", Size
);
69 ok_type(Size
== FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
), "Invalid output size: %ld\n", Size
);
82 MOUNTDEV_NAME MDN
, *AllocatedMDN
;
85 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, &MDN
, sizeof(MDN
) - 1, &Size
, NULL
);
86 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
87 Error
= GetLastError();
88 if (DriveType
== DRIVE_FIXED
)
90 ok_type(Error
== ERROR_INVALID_PARAMETER
, "Expecting ERROR_INVALID_PARAMETER, got %ld\n", Error
);
94 ok_type(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
96 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
98 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, &MDN
, sizeof(MDN
), &Size
, NULL
);
99 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
100 Error
= GetLastError();
101 ok_type(Error
== ERROR_MORE_DATA
, "Expecting ERROR_MORE_DATA, got %ld\n", Error
);
102 ok_type(Size
== sizeof(MOUNTDEV_NAME
), "Invalid output size: %ld\n", Size
);
104 AllocatedMDN
= HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
+ sizeof(UNICODE_NULL
));
105 if (AllocatedMDN
== NULL
)
107 skip_type("Memory allocation failure\n");
112 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, AllocatedMDN
, FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
, &Size
, NULL
);
113 ok_type(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
114 ok_type(Size
== FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
, "Invalid output size: %ld\n", Size
);
115 ok_type(AllocatedMDN
->NameLength
== MDN
.NameLength
, "Mismatching sizes: %d %d\n", AllocatedMDN
->NameLength
, MDN
.NameLength
);
120 AllocatedMDN
->Name
[AllocatedMDN
->NameLength
/ sizeof(WCHAR
) - 1] = UNICODE_NULL
;
122 if ((DriveType
== DRIVE_FIXED
&& wcsstr(AllocatedMDN
->Name
, L
"\\Device\\HarddiskVolume") != NULL
) ||
123 (DriveType
== DRIVE_CDROM
&& wcsstr(AllocatedMDN
->Name
, L
"\\Device\\CdRom") != NULL
))
127 else if (wcsstr(AllocatedMDN
->Name
, L
"\\DosDevices\\") != NULL
)
129 IsValid
= (AllocatedMDN
->Name
[12] == Letter
&& AllocatedMDN
->Name
[13] == L
':');
132 ok_type(IsValid
, "Invalid name: %.*S\n", AllocatedMDN
->NameLength
, AllocatedMDN
->Name
);
136 skip_type("Failed to query device name\n");
139 HeapFree(GetProcessHeap(), 0, AllocatedMDN
);
148 MOUNTDEV_UNIQUE_ID MUI
, *AllocatedMUI
;
151 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, &MUI
, sizeof(MUI
) - 1, &Size
, NULL
);
152 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
153 Error
= GetLastError();
154 if (DriveType
== DRIVE_FIXED
)
156 ok_type(Error
== ERROR_INVALID_PARAMETER
, "Expecting ERROR_INVALID_PARAMETER, got %ld\n", Error
);
160 ok_type(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
162 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
164 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, &MUI
, sizeof(MUI
), &Size
, NULL
);
165 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
166 Error
= GetLastError();
167 ok_type(Error
== ERROR_MORE_DATA
, "Expecting ERROR_MORE_DATA, got %ld\n", Error
);
168 ok_type(Size
== sizeof(MOUNTDEV_UNIQUE_ID
), "Invalid output size: %ld\n", Size
);
170 AllocatedMUI
= HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
+ sizeof(UNICODE_NULL
));
171 if (AllocatedMUI
== NULL
)
173 skip_type("Memory allocation failure\n");
178 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, AllocatedMUI
, FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
, &Size
, NULL
);
179 ok_type(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
180 ok_type(Size
== FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
, "Invalid output size: %ld\n", Size
);
181 ok_type(AllocatedMUI
->UniqueIdLength
== MUI
.UniqueIdLength
, "Mismatching sizes: %d %d\n", AllocatedMUI
->UniqueIdLength
, MUI
.UniqueIdLength
);
183 HeapFree(GetProcessHeap(), 0, AllocatedMUI
);
188 QuerySuggestedLinkName(VOID
)
192 MOUNTDEV_SUGGESTED_LINK_NAME MSLN
;
195 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
, NULL
, 0, &MSLN
, sizeof(MSLN
) - 1, &Size
, NULL
);
196 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
197 Error
= GetLastError();
198 if (DriveType
== DRIVE_FIXED
)
200 ok_type(Error
== ERROR_INVALID_PARAMETER
, "Expecting ERROR_INVALID_PARAMETER, got %ld\n", Error
);
204 ok_type(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
206 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
208 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
, NULL
, 0, &MSLN
, sizeof(MSLN
), &Size
, NULL
);
209 ok_type(Ret
== 0, "DeviceIoControl succeed\n");
210 Error
= GetLastError();
211 if (DriveType
== DRIVE_FIXED
)
213 ok_type(Error
== ERROR_NOT_FOUND
, "Expecting ERROR_NOT_FOUND, got %ld\n", Error
);
217 ok_type(Error
== ERROR_FILE_NOT_FOUND
, "Expecting ERROR_FILE_NOT_FOUND, got %ld\n", Error
);
219 ok_type(Size
== 0, "Invalid output size: %ld\n", Size
);
222 START_TEST(DeviceIoControl
)
225 WCHAR Path
[MAX_PATH
];
226 DWORD DriveMap
, Current
;
227 BOOL DiskDone
, CdRomDone
;
231 DriveMap
= GetLogicalDrives();
232 for (Current
= 0; Current
< 26; ++Current
)
234 if (DriveMap
& (1 << Current
))
236 Ret
= StringCchPrintfW(Path
, MAX_PATH
, L
"%c:\\", Current
+ L
'A');
237 ok(Ret
== S_OK
, "StringCchPrintfW failed: %d\n", Ret
);
239 DriveType
= GetDriveTypeW(Path
);
240 if ((DriveType
== DRIVE_FIXED
&& !DiskDone
) ||
241 (DriveType
== DRIVE_CDROM
&& !CdRomDone
))
243 Ret
= StringCchPrintfW(Path
, MAX_PATH
, L
"\\\\?\\%c:", Current
+ L
'A');
244 ok(Ret
== S_OK
, "StringCchPrintfW failed: %d\n", Ret
);
246 Device
= CreateFileW(Path
, 0, FILE_SHARE_DELETE
| FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
247 if (Device
== INVALID_HANDLE_VALUE
)
249 skip_type("CreateFileW for %S failed: %ld\n", Path
, GetLastError());
253 DiskDone
= (DiskDone
|| (DriveType
== DRIVE_FIXED
));
254 CdRomDone
= (CdRomDone
|| (DriveType
== DRIVE_CDROM
));
256 if (GetDiskGeometry())
260 QuerySuggestedLinkName();
266 if (CdRomDone
&& DiskDone
)
275 skip("No disk drive found\n");
280 skip("No CDROM drive found\n");