You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
#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");
|
|
}
|
|
}
|