66 lines
1.8 KiB
C
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");
|
||
|
}
|
||
|
}
|