Skip to content

Instantly share code, notes, and snippets.

@valinet
Created May 27, 2026 11:14
Show Gist options
  • Select an option

  • Save valinet/5d2724880a3093153c122df0d0b77ef6 to your computer and use it in GitHub Desktop.

Select an option

Save valinet/5d2724880a3093153c122df0d0b77ef6 to your computer and use it in GitHub Desktop.
Truncate utility for Windows
// cl /nologo truncate.c kernel32.lib shell32.lib /O1 /GS- /Gs9999999 /GF /kernel /link /ENTRY:main /NODEFAULTLIB /SUBSYSTEM:windows /NOCOFFGRPINFO /ALIGN:16 /MERGE:.rdata=.text /MERGE:.pdata=.text /OUT:truncate.exe
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <shellapi.h>
#include <stdio.h>
BOOL ParseUInt64W(const wchar_t* s, const wchar_t** end, ULONGLONG* out) {
ULONGLONG v = 0;
const wchar_t* p = s;
if (*p < L'0' || *p > L'9') {
if (end) *end = s;
return FALSE;
}
while (*p >= L'0' && *p <= L'9') {
ULONGLONG d = (ULONGLONG)(*p - L'0');
if (v > (MAXULONGLONG - d) / 10) return FALSE;
v = v * 10 + d;
++p;
}
if (end) *end = p;
*out = v;
return TRUE;
}
BOOL ParseSizeW(const wchar_t* s, int* ps, LONGLONG* out) {
int sign = 0;
if (*s == L'+') { sign = +1; ++s; }
else if (*s == L'-') { sign = -1; ++s; }
const wchar_t* end;
ULONGLONG n;
if (!ParseUInt64W(s, &end, &n)) return FALSE;
ULONGLONG mult = 1;
switch (*end) {
case L'K': case L'k': mult = 1ULL << 10; break;
case L'M': case L'm': mult = 1ULL << 20; break;
case L'G': case L'g': mult = 1ULL << 30; break;
case L'T': case L't': mult = 1ULL << 40; break;
case L'\0': break;
default: return FALSE;
}
LONGLONG delta = (LONGLONG)(n * mult);
*out = (sign == 0) ? delta : sign * delta;
*ps = sign;
return TRUE;
}
int main() {
int argc = 0;
wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
int mode = 0;
wchar_t* wszSize = NULL;
wchar_t* wszFileName = NULL;
for (int i = 1; i < argc; ++i) {
if (mode == 0 && (
(argv[i][0] == L'-' && argv[i][1] == L's') ||
(argv[i][0] == L'-' && argv[i][1] == L'-' && argv[i][2] == L's' && argv[i][3] == L'i' && argv[i][4] == L'z' && argv[i][5] == L'e'))) {
mode = 1;
} else if (mode == 1) {
wszSize = argv[i];
mode = 0;
} else if (mode == 0) {
wszFileName = argv[i];
}
}
if (!wszSize || !wszFileName)
goto end1;
HANDLE hFile = CreateFileW(wszFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (!hFile || hFile == INVALID_HANDLE_VALUE)
goto end1;
LARGE_INTEGER li;
int sign = 0;
if (!ParseSizeW(wszSize, &sign, &li.QuadPart))
goto end2;
if (!SetFilePointerEx(hFile, li, 0, sign ? FILE_END : FILE_BEGIN))
goto end2;
if (!SetEndOfFile(hFile))
goto end2;
end2:
CloseHandle(hFile);
argc = GetLastError();
goto end;
end1:
argc = GetLastError();
end:
LocalFree(argv);
return argc;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment