#include <stdio.h>
#include <Windows.h>
BOOL WriteStuff(HANDLE h) {
const char buffer[] = "123456";
DWORD written = 0;
return WriteFile(h, buffer, sizeof(buffer), &written, NULL);
}
int main()
{
const char path[] = "c:\\nul.iso";
fputs("Creating file...\n", stderr);
HANDLE OutH = CreateFileA(path, GENERIC_READ|GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (OutH == INVALID_HANDLE_VALUE) {
goto error;
}
if (GetLastError() == ERROR_ALREADY_EXISTS) {
fputs("\t...file was already present\n", stderr);
}
LARGE_INTEGER size;
size.LowPart = 0;
size.HighPart = 500;
fprintf(stderr, "Setting file pointer to %lld bytes...\n", size.QuadPart);
if (SetFilePointerEx(OutH, size, nullptr, FILE_BEGIN) == 0) {
goto error;
}
fputs("Setting file size...\n", stderr);
if (SetEndOfFile(OutH) == 0) {
switch (GetLastError()) {
case ERROR_INVALID_FUNCTION: /* NUL files are limitless*/
fputs("\tNUL files are limitless...\n", stderr);
break;
default: goto error;
}
}
fputs("Writing some stuff at the current file pointer...\n", stderr);
if (WriteStuff(OutH) == 0) {
goto error;
}
fputs("Rewinding to start of file...\n", stderr);
if (SetFilePointerEx(OutH, {0}, nullptr, FILE_BEGIN) == 0) {
goto error;
}
fputs("Writing some stuff at the new file pointer...\n", stderr);
if (WriteStuff(OutH) == 0) {
goto error;
}
fputs("We are done!\n", stderr);
return 0;
error:
fprintf(stderr,"\t... that didn't go well: GetLastError() returned 0x%x...\n", GetLastError());
return 1;
}