#include #include #include #include #define dbgprint(...) \ fprintf(stdout, __VA_ARGS__); \ fflush(stdout) #define dbgerror(...) \ fprintf(stdout, __VA_ARGS__); \ fprintf(stdout, " : %08X\n", GetLastError()); \ fflush(stdout) void TestDeleteFile(char *infilename, BOOL do_open, BOOL do_share, BOOL do_map, char *progname){ DWORD n; static char filename[MAX_PATH]; static char readback[MAX_PATH]; void *fileview = NULL; HANDLE h = 0; HANDLE hmap = 0; if (infilename != NULL){ strncpy(filename, infilename, MAX_PATH); filename[MAX_PATH - 1] = 0; } else { GetTempFileNameA(".", "test", 0, filename); } if (do_open){ h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, do_share ? FILE_SHARE_DELETE : 0, NULL, OPEN_EXISTING, 0, 0); if (h == 0 || h == INVALID_HANDLE_VALUE){ dbgerror("CreateFile failed"); } if (h != 0 && h != INVALID_HANDLE_VALUE){ if (!WriteFile(h, filename, sizeof(filename), &n, NULL)){ dbgerror("WriteFile failed after writing %d bytes", n); } SetFilePointer(h, 0, NULL, FILE_BEGIN); if (do_map){ hmap = CreateFileMapping(h, NULL, PAGE_READWRITE, 0, 0, NULL); if (hmap == 0 || hmap == INVALID_HANDLE_VALUE){ dbgerror("CreateFileMapping failed"); } if (hmap != 0 && hmap != INVALID_HANDLE_VALUE){ fileview = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 0); if (fileview == NULL){ dbgerror("MapViewOfFile failed"); } } } } } if (progname != NULL){ _spawnl(_P_WAIT, progname, progname, filename, NULL); } else { dbgprint("DeleteFile: "); if (!DeleteFile(filename)) { dbgerror("Failed"); } else { dbgprint("OK\n"); } } if (h != 0 && h != INVALID_HANDLE_VALUE){ if (!ReadFile(h, readback, sizeof(readback), &n, NULL)){ dbgerror("ReadFile failed after reading %d bytes", n); } if (memcmp(filename, readback, n)){ dbgprint("Readback did not match data originally written\n"); } } if (fileview != NULL){ UnmapViewOfFile(fileview); } if (hmap != 0 && hmap != INVALID_HANDLE_VALUE){ CloseHandle(hmap); } if (h != 0 && h != INVALID_HANDLE_VALUE){ CloseHandle(h); } if (infilename == NULL){ DeleteFile(filename); } } int main (int argc, char **argv){ if (argc == 2){ TestDeleteFile(argv[1], FALSE, FALSE, FALSE, NULL); } else { int i; for (i = 0; i < 8; i++){ dbgprint( "Testing with %s, %s and %s\n", (i & 1) ? "FILE_SHARE_DELETE" : "no sharing", (i & 2) ? "separate process": "same process", (i & 4) ? "file mapping" : "no file mapping" ); TestDeleteFile( NULL, TRUE, (i & 1) ? TRUE : FALSE, (i & 4) ? TRUE : FALSE, (i & 2) ? argv[0] : NULL ); dbgprint("Done\n\n"); } } return 0; }