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>
27 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY
, NULL
, 0, &DG
, sizeof(DG
) - 1, &Size
, NULL
);
28 ok(Ret
== 0, "DeviceIoControl succeed\n");
29 Error
= GetLastError();
30 ok(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
31 ok(Size
== 0, "Invalid output size: %ld\n", Size
);
34 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY
, NULL
, 0, &DG
, sizeof(DG
), &Size
, NULL
);
35 ok(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
36 ok(Size
== sizeof(DG
), "Invalid output size: %ld\n", Size
);
39 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
) - 1, &Size
, NULL
);
40 ok(Ret
== 0, "DeviceIoControl succeed\n");
41 Error
= GetLastError();
42 ok(Error
== ERROR_INSUFFICIENT_BUFFER
, "Expecting ERROR_INSUFFICIENT_BUFFER, got %ld\n", Error
);
43 ok(Size
== 0, "Invalid output size: %ld\n", Size
);
46 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
), &Size
, NULL
);
47 ok(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
48 ok(Size
== FIELD_OFFSET(DISK_GEOMETRY_EX
, Data
), "Invalid output size: %ld\n", Size
);
51 Ret
= DeviceIoControl(Device
, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, NULL
, 0, &DGE
, sizeof(DGE
), &Size
, NULL
);
52 ok(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
53 ok(Size
== sizeof(DGE
), "Invalid output size: %ld\n", Size
);
63 MOUNTDEV_NAME MDN
, *AllocatedMDN
;
66 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, &MDN
, sizeof(MDN
) - 1, &Size
, NULL
);
67 ok(Ret
== 0, "DeviceIoControl succeed\n");
68 Error
= GetLastError();
69 ok(Error
== ERROR_INVALID_PARAMETER
, "Expecting ERROR_INVALID_PARAMETER, got %ld\n", Error
);
70 ok(Size
== 0, "Invalid output size: %ld\n", Size
);
72 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, &MDN
, sizeof(MDN
), &Size
, NULL
);
73 ok(Ret
== 0, "DeviceIoControl succeed\n");
74 Error
= GetLastError();
75 ok(Error
== ERROR_MORE_DATA
, "Expecting ERROR_MORE_DATA, got %ld\n", Error
);
76 ok(Size
== sizeof(MOUNTDEV_NAME
), "Invalid output size: %ld\n", Size
);
78 AllocatedMDN
= HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
+ sizeof(UNICODE_NULL
));
79 if (AllocatedMDN
== NULL
)
81 skip("Memory allocation failure\n");
86 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
, NULL
, 0, AllocatedMDN
, FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
, &Size
, NULL
);
87 ok(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
88 ok(Size
== FIELD_OFFSET(MOUNTDEV_NAME
, Name
) + MDN
.NameLength
, "Invalid output size: %ld\n", Size
);
89 ok(AllocatedMDN
->NameLength
== MDN
.NameLength
, "Mismatching sizes: %d %d\n", AllocatedMDN
->NameLength
, MDN
.NameLength
);
94 AllocatedMDN
->Name
[AllocatedMDN
->NameLength
/ sizeof(WCHAR
) - 1] = UNICODE_NULL
;
96 if (wcsstr(AllocatedMDN
->Name
, L
"\\Device\\HarddiskVolume") != NULL
)
100 else if (wcsstr(AllocatedMDN
->Name
, L
"\\DosDevices\\") != NULL
)
102 IsValid
= (AllocatedMDN
->Name
[12] == Letter
&& AllocatedMDN
->Name
[13] == L
':');
105 ok(IsValid
, "Invalid name: %.*S", AllocatedMDN
->NameLength
, AllocatedMDN
->Name
);
109 skip("Failed to query device name\n");
112 HeapFree(GetProcessHeap(), 0, AllocatedMDN
);
121 MOUNTDEV_UNIQUE_ID MUI
, *AllocatedMUI
;
124 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, &MUI
, sizeof(MUI
) - 1, &Size
, NULL
);
125 ok(Ret
== 0, "DeviceIoControl succeed\n");
126 Error
= GetLastError();
127 ok(Error
== ERROR_INVALID_PARAMETER
, "Expecting ERROR_INVALID_PARAMETER, got %ld\n", Error
);
128 ok(Size
== 0, "Invalid output size: %ld\n", Size
);
130 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, &MUI
, sizeof(MUI
), &Size
, NULL
);
131 ok(Ret
== 0, "DeviceIoControl succeed\n");
132 Error
= GetLastError();
133 ok(Error
== ERROR_MORE_DATA
, "Expecting ERROR_MORE_DATA, got %ld\n", Error
);
134 ok(Size
== sizeof(MOUNTDEV_UNIQUE_ID
), "Invalid output size: %ld\n", Size
);
136 AllocatedMUI
= HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
+ sizeof(UNICODE_NULL
));
137 if (AllocatedMUI
== NULL
)
139 skip("Memory allocation failure\n");
144 Ret
= DeviceIoControl(Device
, IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
, NULL
, 0, AllocatedMUI
, FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
, &Size
, NULL
);
145 ok(Ret
!= 0, "DeviceIoControl failed: %ld\n", GetLastError());
146 ok(Size
== FIELD_OFFSET(MOUNTDEV_UNIQUE_ID
, UniqueId
) + MUI
.UniqueIdLength
, "Invalid output size: %ld\n", Size
);
147 ok(AllocatedMUI
->UniqueIdLength
== MUI
.UniqueIdLength
, "Mismatching sizes: %d %d\n", AllocatedMUI
->UniqueIdLength
, MUI
.UniqueIdLength
);
149 HeapFree(GetProcessHeap(), 0, AllocatedMUI
);
152 START_TEST(DeviceIoControl
)
155 WCHAR Path
[MAX_PATH
];
160 Ret
= GetSystemDirectoryW(Path
, MAX_PATH
);
161 ok(Ret
> 0, "GetSystemDirectory failed\n");
163 Letter
= towupper(Path
[0]);
164 ok(Path
[1] == ':', "Not a drive letter: %c\n", Path
[1]);
165 ok(Path
[2] == '\\', "Not a drive letter: %c\n", Path
[2]);
167 Ret
= StringCchPrintfW(Path
, MAX_PATH
, L
"\\\\?\\%c:", Letter
);
168 ok(Ret
== S_OK
, "StringCchPrintfW failed: %d\n", Ret
);
170 Device
= CreateFileW(Path
, 0, FILE_SHARE_DELETE
| FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
171 if (Device
== INVALID_HANDLE_VALUE
)
173 skip("CreateFileW for %S failed: %ld\n", Path
, GetLastError());