From bfa84533d4ea43c604871e91d92f988cf823171b Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 11 Mar 2021 21:55:39 +0000 Subject: [PATCH] Set win32 timestamps using a for loop instead of repeating code. --- setter/src/win32/CMakeLists.txt | 2 +- setter/src/win32/time.c | 324 ++++---------------------------- setter/src/win32/time.h | 48 +++++ setter/src/win32/win32.h | 11 -- 4 files changed, 88 insertions(+), 297 deletions(-) create mode 100644 setter/src/win32/time.h diff --git a/setter/src/win32/CMakeLists.txt b/setter/src/win32/CMakeLists.txt index 513d8b8..2d0cdc8 100644 --- a/setter/src/win32/CMakeLists.txt +++ b/setter/src/win32/CMakeLists.txt @@ -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}") diff --git a/setter/src/win32/time.c b/setter/src/win32/time.c index ef445a1..8bf8db6 100644 --- a/setter/src/win32/time.c +++ b/setter/src/win32/time.c @@ -41,6 +41,9 @@ Copyright (C) 2011-2021 Natalia Portillo #include #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 diff --git a/setter/src/win32/time.h b/setter/src/win32/time.h new file mode 100644 index 0000000..1a2a657 --- /dev/null +++ b/setter/src/win32/time.h @@ -0,0 +1,48 @@ +// +// Created by claunia on 11/3/21. +// + +#ifndef SETTER_SRC_WIN32_TIME_H_ +#define SETTER_SRC_WIN32_TIME_H_ + +#include + +#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_ diff --git a/setter/src/win32/win32.h b/setter/src/win32/win32.h index b581bb5..9e08f03 100644 --- a/setter/src/win32/win32.h +++ b/setter/src/win32/win32.h @@ -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;