int wmain(int argc, LPWSTR *argv) { UNICODE_STRING NtPath; OBJECT_ATTRIBUTES objattr; NTSTATUS stat; SetOemPrintFLineLength(GetStdHandle(STD_ERROR_HANDLE)); if (argc < 2) { fprintf(stderr, "Usage:\r\n%ws file [...]\r\n", argv[0]); return 1; } while (--argc) { if ((++argv)[0][0] == '\0') continue; if (argv[0][0] == L'\\') stat = RtlCreateUnicodeString(&NtPath, argv[0]); else stat = RtlDosPathNameToNtPathName_U(argv[0], &NtPath, NULL, NULL); if (!NT_SUCCESS(stat)) { LPSTR szErrMsg = nt_errmsgA(stat); oem_printf(stderr, "Error: '%1!ws!': %2%%n", argv[0], szErrMsg); LocalFree(szErrMsg); return 1; } InitializeObjectAttributes(&objattr, &NtPath, OBJ_CASE_INSENSITIVE, NULL, NULL); stat = NtDeleteFile(&objattr); if (NT_SUCCESS(stat)) oem_printf(stderr, "Success: '%1!ws!'%%n", argv[0]); else { LPSTR szErrMsg = nt_errmsgA(stat); oem_printf(stderr, "Error: '%1!ws!': %2%%n", argv[0], szErrMsg); LocalFree(szErrMsg); } RtlFreeUnicodeString(&NtPath); } return 0; }
static NTSTATUS NtRemoveSingleFile(POBJECT_ATTRIBUTES PtrObjectAttributes) { NTSTATUS Status = STATUS_SUCCESS; ULONG TryCount = 0; // Attempt to delete the file __TryDeleteFile: Status = NtDeleteFile(PtrObjectAttributes); // If STATUS_ACCESS_DENIED, try to rewrite the security descriptor if(Status == STATUS_ACCESS_DENIED && TryCount == 0) { Status = NtSetFileAccessToEveryone(PtrObjectAttributes, GENERIC_ALL | DELETE); if(NT_SUCCESS(Status)) { TryCount++; goto __TryDeleteFile; } } return Status; }
void test_query_directory( void ) { WCHAR dirname[] = L"\\??\\c:\\filetest"; WCHAR filename[] = L"\\??\\c:\\filetest\\edb.chk"; WCHAR edb[] = L"edb<\"*"; UNICODE_STRING path, mask, empty; OBJECT_ATTRIBUTES oa; HANDLE dir, file; IO_STATUS_BLOCK iosb; BYTE buffer[0x100]; NTSTATUS r; iosb.Status = ~0; iosb.Information = ~0; empty.Buffer = 0; empty.Length = 0; empty.MaximumLength = 0; init_us(&mask, edb); oa.Length = sizeof oa; oa.RootDirectory = 0; oa.ObjectName = &path; oa.Attributes = OBJ_CASE_INSENSITIVE; oa.SecurityDescriptor = 0; oa.SecurityQualityOfService = 0; init_us(&path, filename); r = NtDeleteFile( &oa ); // delete the file to ensure preconditions init_us(&path, dirname); r = NtDeleteFile( &oa ); // create a test directory r = NtCreateFile( &dir, GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY, &oa, &iosb, 0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, FILE_DIRECTORY_FILE, 0, 0 ); ok( r == STATUS_SUCCESS, "failed to create dir %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information); // add a file to the directory init_us(&path, filename); r = NtCreateFile( &file, GENERIC_READ | GENERIC_WRITE, &oa, &iosb, 0, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ, FILE_CREATE, 0, 0, 0 ); ok( r == STATUS_SUCCESS, "failed to create file %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); ok( iosb.Information == FILE_CREATED, "information wrong %08lx\n", iosb.Information); r = NtClose( file ); ok( r == STATUS_SUCCESS, "status wrong %08lx\n", r); // query first file... should be "." r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_dot(&iosb, buffer); // query second file... should be ".." r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_dotdot(&iosb, buffer); // query third file... should be "edb.chk" r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); check_edb(&iosb, buffer); // no more files... r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, 0, 0); ok( r == STATUS_NO_MORE_FILES, "failed to query directory %08lx\n", r); // try with a mask r = NtQueryDirectoryFile( dir, 0, 0, 0, &iosb, buffer, sizeof buffer, FileBothDirectoryInformation, TRUE, &mask, TRUE); ok( r == STATUS_SUCCESS, "failed to query directory %08lx\n", r); ok( iosb.Status == STATUS_SUCCESS, "status wrong %08lx\n", iosb.Status); check_dot(&iosb, buffer); r = NtClose( dir ); ok( r == STATUS_SUCCESS, "failed to close handle %08lx\n", r); // set oa to point the the directory again init_us(&path, dirname); // re-open the file and scan with a mask // looks like the mask is set on the first scan after opening the directory r = query_one(&oa, edb, buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // what happens if the mask is present but empty? r = query_one(&oa, L"", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // how does * work? r = query_one(&oa, L"*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // how does * work? r = query_one(&oa, L"*.*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_dot(&iosb, buffer); // what does *e return? r = query_one(&oa, L"e*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // can we get back .. r = query_one(&oa, L"..", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // what about ... ? r = query_one(&oa, L"...", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // does ? work r = query_one(&oa, L"??", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // does ? work r = query_one(&oa, L"?.", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // exact match r = query_one(&oa, L"edb.chk", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // almost exact match r = query_one(&oa, L"edb.ch", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // case insensitive match r = query_one(&oa, L"EDB.CHK", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // dot star? r = query_one(&oa, L"edb.*", buffer, sizeof buffer, &iosb); ok( r == STATUS_SUCCESS, "query failed %08lx\n", r); check_edb(&iosb, buffer); // bad masks r = query_one(&oa, L"|", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L":", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L"/", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); r = query_one(&oa, L"\\", buffer, sizeof buffer, &iosb); ok( r == STATUS_NO_SUCH_FILE, "query failed %08lx\n", r); // delete the file init_us(&path, filename); r = NtDeleteFile( &oa ); ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r); // delete the directory init_us(&path, dirname); r = NtDeleteFile( &oa ); ok( r == STATUS_SUCCESS, "failed to delete directory %08lx\n", r); }