ntdll: Add some tests for NtDeleteFile.

This commit is contained in:
Jeff Zaroyko 2008-08-31 21:54:03 +10:00 committed by Alexandre Julliard
parent 1b5873accc
commit a2022c898a
1 changed files with 70 additions and 0 deletions

View File

@ -2,6 +2,7 @@
* *
* Copyright 2007 Jeff Latimer * Copyright 2007 Jeff Latimer
* Copyright 2007 Andrey Turkin * Copyright 2007 Andrey Turkin
* Copyright 2008 Jeff Zaroyko
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -38,9 +39,12 @@
#define IO_COMPLETION_ALL_ACCESS 0x001F0003 #define IO_COMPLETION_ALL_ACCESS 0x001F0003
#endif #endif
static NTSTATUS (WINAPI *pRtlFreeUnicodeString)( PUNICODE_STRING );
static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR ); static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR );
static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)( LPCWSTR, PUNICODE_STRING, PWSTR*, CURDIR* );
static NTSTATUS (WINAPI *pNtCreateMailslotFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, static NTSTATUS (WINAPI *pNtCreateMailslotFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK,
ULONG, ULONG, ULONG, PLARGE_INTEGER ); ULONG, ULONG, ULONG, PLARGE_INTEGER );
static NTSTATUS (WINAPI *pNtDeleteFile)(POBJECT_ATTRIBUTES ObjectAttributes);
static NTSTATUS (WINAPI *pNtReadFile)(HANDLE hFile, HANDLE hEvent, static NTSTATUS (WINAPI *pNtReadFile)(HANDLE hFile, HANDLE hEvent,
PIO_APC_ROUTINE apc, void* apc_user, PIO_APC_ROUTINE apc, void* apc_user,
PIO_STATUS_BLOCK io_status, void* buffer, ULONG length, PIO_STATUS_BLOCK io_status, void* buffer, ULONG length,
@ -136,6 +140,68 @@ static void WINAPI apc( void *arg, IO_STATUS_BLOCK *iosb, ULONG reserved )
ok( !reserved, "reserved is not 0: %x\n", reserved ); ok( !reserved, "reserved is not 0: %x\n", reserved );
} }
static void delete_file_test(void)
{
NTSTATUS ret;
OBJECT_ATTRIBUTES attr;
UNICODE_STRING nameW;
WCHAR pathW[MAX_PATH];
WCHAR pathsubW[MAX_PATH];
static const WCHAR testdirW[] = {'n','t','d','e','l','e','t','e','f','i','l','e',0};
static const WCHAR subdirW[] = {'\\','s','u','b',0};
ret = GetTempPathW(MAX_PATH, pathW);
if (!ret)
{
ok(0, "couldn't get temp dir\n");
return;
}
if (ret + sizeof(testdirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH)
{
ok(0, "MAX_PATH exceeded in constructing paths\n");
return;
}
lstrcatW(pathW, testdirW);
lstrcpyW(pathsubW, pathW);
lstrcatW(pathsubW, subdirW);
ret = CreateDirectoryW(pathW, NULL);
ok(ret == TRUE, "couldn't create directory ntdeletefile\n");
if (!pRtlDosPathNameToNtPathName_U(pathW, &nameW, NULL, NULL))
{
ok(0,"RtlDosPathNametoNtPathName_U failed\n");
return;
}
attr.Length = sizeof(attr);
attr.RootDirectory = 0;
attr.Attributes = OBJ_CASE_INSENSITIVE;
attr.ObjectName = &nameW;
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
/* test NtDeleteFile on an empty directory */
ret = pNtDeleteFile(&attr);
ok(ret == STATUS_SUCCESS, "NtDeleteFile should succeed in removing an empty directory\n");
ret = RemoveDirectoryW(pathW);
ok(ret == FALSE, "expected to fail removing directory, NtDeleteFile should have removed it\n");
/* test NtDeleteFile on a non-empty directory */
ret = CreateDirectoryW(pathW, NULL);
ok(ret == TRUE, "couldn't create directory ntdeletefile ?!\n");
ret = CreateDirectoryW(pathsubW, NULL);
ok(ret == TRUE, "couldn't create directory subdir\n");
ret = pNtDeleteFile(&attr);
ok(ret == STATUS_SUCCESS, "expected NtDeleteFile to ret STATUS_SUCCESS\n");
ret = RemoveDirectoryW(pathsubW);
ok(ret == TRUE, "expected to remove directory ntdeletefile\\sub\n");
ret = RemoveDirectoryW(pathW);
ok(ret == TRUE, "expected to remove directory ntdeletefile, NtDeleteFile failed.\n");
pRtlFreeUnicodeString( &nameW );
}
static void read_file_test(void) static void read_file_test(void)
{ {
const char text[] = "foobar"; const char text[] = "foobar";
@ -623,8 +689,11 @@ START_TEST(file)
return; return;
} }
pRtlFreeUnicodeString = (void *)GetProcAddress(hntdll, "RtlFreeUnicodeString");
pRtlInitUnicodeString = (void *)GetProcAddress(hntdll, "RtlInitUnicodeString"); pRtlInitUnicodeString = (void *)GetProcAddress(hntdll, "RtlInitUnicodeString");
pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U");
pNtCreateMailslotFile = (void *)GetProcAddress(hntdll, "NtCreateMailslotFile"); pNtCreateMailslotFile = (void *)GetProcAddress(hntdll, "NtCreateMailslotFile");
pNtDeleteFile = (void *)GetProcAddress(hntdll, "NtDeleteFile");
pNtReadFile = (void *)GetProcAddress(hntdll, "NtReadFile"); pNtReadFile = (void *)GetProcAddress(hntdll, "NtReadFile");
pNtWriteFile = (void *)GetProcAddress(hntdll, "NtWriteFile"); pNtWriteFile = (void *)GetProcAddress(hntdll, "NtWriteFile");
pNtClose = (void *)GetProcAddress(hntdll, "NtClose"); pNtClose = (void *)GetProcAddress(hntdll, "NtClose");
@ -635,6 +704,7 @@ START_TEST(file)
pNtSetIoCompletion = (void *)GetProcAddress(hntdll, "NtSetIoCompletion"); pNtSetIoCompletion = (void *)GetProcAddress(hntdll, "NtSetIoCompletion");
pNtSetInformationFile = (void *)GetProcAddress(hntdll, "NtSetInformationFile"); pNtSetInformationFile = (void *)GetProcAddress(hntdll, "NtSetInformationFile");
delete_file_test();
read_file_test(); read_file_test();
nt_mailslot_test(); nt_mailslot_test();
test_iocompletion(); test_iocompletion();