windows-nt/Source/XPSP1/NT/drivers/ftapi/ftextend/ftextend.c
2020-09-26 16:20:57 +08:00

66 lines
1.8 KiB
C

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <ftapi.h>
void __cdecl
main(
int argc,
char** argv
)
{
TCHAR dosDriveName[10];
HANDLE h;
BOOL b;
PARTITION_INFORMATION partInfo;
DWORD bytes;
DISK_GEOMETRY geometry;
LONGLONG newSectors;
if (argc != 2) {
printf("usage: %s drive:\n", argv[0]);
return;
}
if (argv[1][1] != ':' || argv[1][2] != 0) {
printf("usage: %s drive:\n", argv[0]);
return;
}
wsprintf(dosDriveName, TEXT("\\\\.\\%c:"), argv[1][0]);
h = CreateFile(dosDriveName, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, INVALID_HANDLE_VALUE);
if (h == INVALID_HANDLE_VALUE) {
printf("Can't open, failed with %d\n", GetLastError());
return;
}
b = DeviceIoControl(h, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0,
&partInfo, sizeof(partInfo), &bytes, NULL);
if (!b) {
printf("Can't read partition info, failed with %d\n", GetLastError());
return;
}
b = DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
&geometry, sizeof(geometry), &bytes, NULL);
if (!b) {
printf("Can't read geometry info, failed with %d\n", GetLastError());
return;
}
newSectors = partInfo.PartitionLength.QuadPart/geometry.BytesPerSector;
b = DeviceIoControl(h, FSCTL_EXTEND_VOLUME, &newSectors, sizeof(newSectors),
NULL, 0, &bytes, NULL);
if (b) {
printf("File system extended successfully.\n");
} else {
printf("File system extension failed.\n");
}
}