Set win32 timestamps using a for loop instead of repeating code.

This commit is contained in:
2021-03-11 21:55:39 +00:00
parent 8433f998b9
commit bfa84533d4
4 changed files with 88 additions and 297 deletions

View File

@@ -7,7 +7,7 @@ project(
DESCRIPTION "Filesystem test creator for 32-bit and 64-bit Windows"
LANGUAGES C)
set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c attr.h rsrcfork.h xattr.h links.h volume.h)
set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c attr.h rsrcfork.h xattr.h links.h volume.h time.h)
set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")

View File

@@ -41,6 +41,9 @@ Copyright (C) 2011-2021 Natalia Portillo
#include <string.h>
#include "win32.h"
#include "time.h"
#include "../include/defs.h"
void Timestamps(const char* path)
@@ -50,12 +53,10 @@ void Timestamps(const char* path)
DWORD error;
LPSTR lpRootPathName;
size_t pathSize = strlen(path);
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
HANDLE h;
DWORD rc, wRc, cRc, tRc;
DWORD dwNumberOfBytesWritten;
int i;
lpRootPathName = malloc(dwMaxNameSize);
@@ -99,293 +100,46 @@ void Timestamps(const char* path)
printf("Creating timestamped files.\n");
h = CreateFileA("MAXCTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
for(i = 0; i < KNOWN_WIN32_TIMESTAMPS; i++)
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MAXDATETIME, "creation");
ftCreationTime.dwHighDateTime = MAXTIMESTAMP;
ftCreationTime.dwLowDateTime = MAXTIMESTAMP;
h = CreateFileA(
win32_timestamps[i].filename, dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, win32_timestamps[i].message, win32_timestamps[i].type);
ret = SetFileTime(h, &ftCreationTime, NULL, NULL);
if(!ret) tRc = GetLastError();
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
if(strcmp(win32_timestamps[i].type, "creation") == 0)
ret = SetFileTime(h, &win32_timestamps[i].ftCreationTime, NULL, NULL);
else if(strcmp(win32_timestamps[i].type, "access") == 0)
ret = SetFileTime(h, NULL, &win32_timestamps[i].ftLastAccessTime, NULL);
else if(strcmp(win32_timestamps[i].type, "modification") == 0)
ret = SetFileTime(h, NULL, NULL, &win32_timestamps[i].ftLastWriteTime);
else
tRc = -1;
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n",
win32_timestamps[i].filename,
rc,
wRc,
cRc,
tRc);
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MAXCTIME", rc, wRc, cRc, tRc);
h = CreateFileA("MAXATIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MAXDATETIME, "access");
ftLastAccessTime.dwHighDateTime = MAXTIMESTAMP;
ftLastAccessTime.dwLowDateTime = MAXTIMESTAMP;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, &ftLastAccessTime, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MAXATIME", rc, wRc, cRc, tRc);
h = CreateFileA("MAXMTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MAXDATETIME, "modification");
ftLastWriteTime.dwHighDateTime = MAXTIMESTAMP;
ftLastWriteTime.dwLowDateTime = MAXTIMESTAMP;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, NULL, &ftLastWriteTime);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MAXMTIME", rc, wRc, cRc, tRc);
h = CreateFileA("MINCTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MINDATETIME, "creation");
ftCreationTime.dwHighDateTime = MINTIMESTAMP;
ftCreationTime.dwLowDateTime = MINTIMESTAMP;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, &ftCreationTime, NULL, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MINCTIME", rc, wRc, cRc, tRc);
h = CreateFileA("MINATIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MINDATETIME, "access");
ftLastAccessTime.dwHighDateTime = MINTIMESTAMP;
ftLastAccessTime.dwLowDateTime = MINTIMESTAMP;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, &ftLastAccessTime, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MINATIME", rc, wRc, cRc, tRc);
h = CreateFileA("MINMTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, MINDATETIME, "modification");
ftLastWriteTime.dwHighDateTime = MINTIMESTAMP;
ftLastWriteTime.dwLowDateTime = MINTIMESTAMP;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, NULL, &ftLastWriteTime);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "MINMTIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y1KCTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y1KDATETIME, "creation");
ftCreationTime.dwHighDateTime = TIMESTAMP_HI;
ftCreationTime.dwLowDateTime = Y1KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, &ftCreationTime, NULL, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y1KCTIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y1KATIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y1KDATETIME, "access");
ftLastAccessTime.dwHighDateTime = TIMESTAMP_HI;
ftLastAccessTime.dwLowDateTime = Y1KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, &ftLastAccessTime, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y1KATIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y1KMTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y1KDATETIME, "modification");
ftLastWriteTime.dwHighDateTime = TIMESTAMP_HI;
ftLastWriteTime.dwLowDateTime = Y1KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, NULL, &ftLastWriteTime);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y1KMTIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y2KCTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y2KDATETIME, "creation");
ftCreationTime.dwHighDateTime = TIMESTAMP_HI;
ftCreationTime.dwLowDateTime = Y2KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, &ftCreationTime, NULL, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y2KCTIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y2KATIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y2KDATETIME, "access");
ftLastAccessTime.dwHighDateTime = TIMESTAMP_HI;
ftLastAccessTime.dwLowDateTime = Y2KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, &ftLastAccessTime, NULL);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y2KATIME", rc, wRc, cRc, tRc);
h = CreateFileA("Y2KMTIME", dwFilePermissions, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
rc = 0;
wRc = 0;
cRc = 0;
tRc = 0;
if(h == INVALID_HANDLE_VALUE) rc = GetLastError();
else
{
memset(message, 0, 300);
sprintf(message, DATETIME_FORMAT, Y1KDATETIME, "modification");
ftLastWriteTime.dwHighDateTime = TIMESTAMP_HI;
ftLastWriteTime.dwLowDateTime = Y2KTIMESTAMP_LO;
ret = WriteFile(h, message, strlen(message), &dwNumberOfBytesWritten, NULL);
if(!ret) wRc = GetLastError();
ret = SetFileTime(h, NULL, NULL, &ftLastWriteTime);
if(!ret) tRc = GetLastError();
ret = CloseHandle(h);
if(!ret) cRc = GetLastError();
}
printf("\tFile name = \"%s\", rc = %lu, wRc = %lu, cRc = %lu, tRc = %lu\n", "Y2KMTIME", rc, wRc, cRc, tRc);
}
#endif

48
setter/src/win32/time.h Normal file
View File

@@ -0,0 +1,48 @@
//
// Created by claunia on 11/3/21.
//
#ifndef SETTER_SRC_WIN32_TIME_H_
#define SETTER_SRC_WIN32_TIME_H_
#include <windows.h>
#define DATETIME_FORMAT "This file is dated %s for %s\r"
#define MAXDATETIME "60056/05/28 05:36:11"
#define MINDATETIME "1601/01/01 00:00:00"
#define Y2KDATETIME "2000/01/01 00:00:00"
#define Y1KDATETIME "1999/12/31 23:59:59"
#define MAXTIMESTAMP 0xFFFFFFFF
#define MINTIMESTAMP 0x00000000
#define TIMESTAMP_HI 0x01BF53EB
#define Y2KTIMESTAMP_LO 0x256D4000
#define Y1KTIMESTAMP_LO 0x24D4A980
typedef struct
{
char filename[9];
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
char type[13];
char message[21];
} win32_time_tests_t;
#define KNOWN_WIN32_TIMESTAMPS 12
static const win32_time_tests_t win32_timestamps[KNOWN_WIN32_TIMESTAMPS] = {
{"MAXCTIME", {MAXTIMESTAMP, MAXTIMESTAMP}, {0, 0}, {0, 0}, "creation", MAXDATETIME},
{"MAXATIME", {0, 0}, {MAXTIMESTAMP, MAXTIMESTAMP}, {0, 0}, "access", MAXDATETIME},
{"MAXMTIME", {0, 0}, {0, 0}, {MAXTIMESTAMP, MAXTIMESTAMP}, "modification", MAXDATETIME},
{"MINCTIME", {MINTIMESTAMP, MINTIMESTAMP}, {0, 0}, {0, 0}, "creation", MINDATETIME},
{"MINATIME", {0, 0}, {MINTIMESTAMP, MINTIMESTAMP}, {0, 0}, "access", MINDATETIME},
{"MINMTIME", {0, 0}, {0, 0}, {MINTIMESTAMP, MINTIMESTAMP}, "modification", MINDATETIME},
{"Y1KCTIME", {Y1KTIMESTAMP_LO, TIMESTAMP_HI}, {0, 0}, {0, 0}, "creation", Y1KDATETIME},
{"Y1KATIME", {0, 0}, {Y1KTIMESTAMP_LO, TIMESTAMP_HI}, {0, 0}, "access", Y1KDATETIME},
{"Y1KMTIME", {0, 0}, {0, 0}, {Y1KTIMESTAMP_LO, TIMESTAMP_HI}, "modification", Y1KDATETIME},
{"Y2KCTIME", {Y2KTIMESTAMP_LO, TIMESTAMP_HI}, {0, 0}, {0, 0}, "creation", Y2KDATETIME},
{"Y2KATIME", {0, 0}, {Y2KTIMESTAMP_LO, TIMESTAMP_HI}, {0, 0}, "access", Y2KDATETIME},
{"Y2KMTIME", {0, 0}, {0, 0}, {Y2KTIMESTAMP_LO, TIMESTAMP_HI}, "modification", Y2KDATETIME},
};
#endif // SETTER_SRC_WIN32_TIME_H_

View File

@@ -229,17 +229,6 @@ typedef struct _WINNT_FILE_ZERO_DATA_INFORMATION
} WINNT_FILE_ZERO_DATA_INFORMATION, *PWINNT_FILE_ZERO_DATA_INFORMATION;
#define DATETIME_FORMAT "This file is dated %s for %s\r"
#define MAXDATETIME "60056/05/28 05:36:11"
#define MINDATETIME "1601/01/01 00:00:00"
#define Y2KDATETIME "2000/01/01 00:00:00"
#define Y1KDATETIME "1999/12/31 23:59:59"
#define MAXTIMESTAMP 0xFFFFFFFF
#define MINTIMESTAMP 0x00000000
#define TIMESTAMP_HI 0x01BF53EB
#define Y2KTIMESTAMP_LO 0x256D4000
#define Y1KTIMESTAMP_LO 0x24D4A980
typedef struct _WIN_OSVERSIONINFOA
{
DWORD dwOSVersionInfoSize;