timeもどき

なんかCygwin bashのtimeコマンドがまともな結果を返さないので、自分で作りました。
エラーチェックがテキトーとか、分の表示が0固定とか、やっつけコードですが、貼っときます。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

FILETIME diff_time(const FILETIME* lhs, const FILETIME* rhs)
{
    FILETIME ft;
    ft.dwHighDateTime = lhs->dwHighDateTime - rhs->dwHighDateTime;
    if (lhs->dwLowDateTime < rhs->dwLowDateTime)
        ft.dwHighDateTime--;
    ft.dwLowDateTime = lhs->dwLowDateTime - rhs->dwLowDateTime;
    return ft;
}

unsigned to_msec(const FILETIME* ft)
{
    return ft->dwLowDateTime / 10000;
}

unsigned to_sec(const FILETIME* ft)
{
    return ft->dwLowDateTime / 10000000;
}

int main(int argc, char* argv[])
{
    STARTUPINFO params = { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION info;
    FILETIME start = {0,0};
    FILETIME end = {0,0};
    FILETIME kernel = {0,0};
    FILETIME user = {0,0};
    FILETIME real = {0,0};
    const char* cmdline;
    const char* delim;
    char* cmdline_buf;
    DWORD code;

    cmdline = GetCommandLine();
    delim = strchr(cmdline, ' ');
    while (*delim == ' ')
        ++delim;
    cmdline_buf = malloc(strlen(delim)+2);
    strcpy(cmdline_buf, delim);

    params.dwFlags = STARTF_USESTDHANDLES;
    params.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    params.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    params.hStdError = GetStdHandle(STD_ERROR_HANDLE);

    if (CreateProcess(0, cmdline_buf, 0, 0, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, &params, &info) == TRUE)
    {
        CloseHandle(info.hThread);
        WaitForSingleObject(info.hProcess, INFINITE);
        GetProcessTimes(info.hProcess, &start, &end, &kernel, &user);
        GetExitCodeProcess(info.hProcess, &code);
        CloseHandle(info.hProcess);

        real = diff_time(&end, &start);

        printf("real    0m%u.%03us\n", to_sec(&real), to_msec(&real) % 1000u);
        printf("user    0m%u.%03us\n", to_sec(&user), to_msec(&user) % 1000u);
        printf("sys     0m%u.%03us\n", to_sec(&kernel), to_msec(&kernel) % 1000u);
    }
    else
        printf("error=%u\n", GetLastError());

    free(cmdline_buf);

    return (int)code;
}

なお、実行ファイル名をtime.exeとした場合、「.exe」を省略して実行するとcmd.exeの内部コマンドが呼ばれるので注意してください。
ディレクトリを付けないとダメでした。ファイル名を変えたほうがいいです。