diff options
author | richard <richard.withnell@bmce-networks.com> | 2018-01-16 03:25:41 +0300 |
---|---|---|
committer | richard <richard.withnell@bmce-networks.com> | 2018-01-16 03:25:41 +0300 |
commit | 40cea3bbb47b608b55705b25f305267803082cc2 (patch) | |
tree | 5255c734b8c31c7d515c0c7873ad79cde553c63a | |
parent | cb44e53dd32460c41bdeb3d20a88cfe871d477f6 (diff) |
Add CreateFileA stub
-rw-r--r-- | peloader/winapi/Files.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/peloader/winapi/Files.c b/peloader/winapi/Files.c index 7182345..1b4c392 100644 --- a/peloader/winapi/Files.c +++ b/peloader/winapi/Files.c @@ -71,6 +71,48 @@ enum { TRUNCATE_EXISTING = 5 }; +static HANDLE WINAPI CreateFileA(PCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, PVOID lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +{ + FILE *FileHandle; + + DebugLog("%p [%s], %#x, %#x, %p, %#x, %#x, %p", lpFileName, lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); + + // Translate path seperator. + while (strchr(lpFileName, '\\')) + *strchr(lpFileName, '\\') = '/'; + + // I'm just going to tolower() everything. + for (char *t = lpFileName; *t; t++) + *t = tolower(*t); + + switch (dwCreationDisposition) { + case OPEN_EXISTING: + FileHandle = fopen(lpFileName, "r"); + break; + case CREATE_ALWAYS: + FileHandle = fopen("/dev/null", "w"); + break; + // This is the disposition used by CreateTempFile(). + case CREATE_NEW: + if (strstr(lpFileName, "/faketemp/")) { + FileHandle = fopen(lpFileName, "w"); + // Unlink it immediately so it's cleaned up on exit. + unlink(lpFileName); + } else { + FileHandle = fopen("/dev/null", "w"); + } + break; + default: + abort(); + } + + DebugLog("%s => %p", lpFileName, FileHandle); + + SetLastError(ERROR_FILE_NOT_FOUND); + return FileHandle ? FileHandle : INVALID_HANDLE_VALUE; +} + + static HANDLE WINAPI CreateFileW(PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, PVOID lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { FILE *FileHandle; @@ -304,6 +346,7 @@ DECLARE_CRT_EXPORT("GetFileVersionInfoExW", GetFileVersionInfoExW); DECLARE_CRT_EXPORT("GetFileVersionInfoSizeExW", GetFileVersionInfoSizeExW); DECLARE_CRT_EXPORT("GetFileAttributesW", GetFileAttributesW); DECLARE_CRT_EXPORT("GetFileAttributesExW", GetFileAttributesExW); +DECLARE_CRT_EXPORT("CreateFileA", CreateFileA); DECLARE_CRT_EXPORT("CreateFileW", CreateFileW); DECLARE_CRT_EXPORT("SetFilePointer", SetFilePointer); DECLARE_CRT_EXPORT("SetFilePointerEx", SetFilePointerEx); |