Alexandre Julliard : kernel32: Move RemoveDirectoryA/W() implementation to kernelbase.
Alexandre Julliard
julliard at winehq.org
Wed Jul 8 15:34:35 CDT 2020
Module: wine
Branch: master
Commit: f8699c0a71a528d287b84cd0bc5b5bb7cec924f0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8699c0a71a528d287b84cd0bc5b5bb7cec924f0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 8 12:47:46 2020 +0200
kernel32: Move RemoveDirectoryA/W() implementation to kernelbase.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/kernel32.spec | 4 +--
dlls/kernel32/path.c | 62 -----------------------------------------
dlls/kernelbase/file.c | 44 +++++++++++++++++++++++++++++
dlls/kernelbase/kernelbase.spec | 4 +--
dlls/ntdll/tests/file.c | 3 +-
5 files changed, 50 insertions(+), 67 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index b19dfa00df..0c64144d7f 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1268,8 +1268,8 @@
@ stdcall ReleaseSemaphoreWhenCallbackReturns(ptr long long) ntdll.TpCallbackReleaseSemaphoreOnCompletion
@ stdcall ReleaseSRWLockExclusive(ptr) ntdll.RtlReleaseSRWLockExclusive
@ stdcall ReleaseSRWLockShared(ptr) ntdll.RtlReleaseSRWLockShared
-@ stdcall RemoveDirectoryA(str)
-@ stdcall RemoveDirectoryW(wstr)
+@ stdcall -import RemoveDirectoryA(str)
+@ stdcall -import RemoveDirectoryW(wstr)
# @ stub RemoveLocalAlternateComputerNameA
# @ stub RemoveLocalAlternateComputerNameW
@ stdcall RemoveVectoredContinueHandler(ptr) ntdll.RtlRemoveVectoredContinueHandler
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index db2c1fb024..d0f27d3359 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -228,68 +228,6 @@ BOOL WINAPI CreateDirectoryExA( LPCSTR template, LPCSTR path, LPSECURITY_ATTRIBU
}
-/***********************************************************************
- * RemoveDirectoryW (KERNEL32.@)
- */
-BOOL WINAPI RemoveDirectoryW( LPCWSTR path )
-{
- OBJECT_ATTRIBUTES attr;
- UNICODE_STRING nt_name;
- ANSI_STRING unix_name;
- IO_STATUS_BLOCK io;
- NTSTATUS status;
- HANDLE handle;
- BOOL ret = FALSE;
-
- TRACE( "%s\n", debugstr_w(path) );
-
- if (!RtlDosPathNameToNtPathName_U( path, &nt_name, NULL, NULL ))
- {
- SetLastError( ERROR_PATH_NOT_FOUND );
- return FALSE;
- }
- attr.Length = sizeof(attr);
- attr.RootDirectory = 0;
- attr.Attributes = OBJ_CASE_INSENSITIVE;
- attr.ObjectName = &nt_name;
- attr.SecurityDescriptor = NULL;
- attr.SecurityQualityOfService = NULL;
-
- if (!set_ntstatus( NtOpenFile( &handle, DELETE | SYNCHRONIZE, &attr, &io,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT )))
- {
- RtlFreeUnicodeString( &nt_name );
- return FALSE;
- }
-
- status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN );
- RtlFreeUnicodeString( &nt_name );
- if (!set_ntstatus( status ))
- {
- NtClose( handle );
- return FALSE;
- }
-
- if (!(ret = (rmdir( unix_name.Buffer ) != -1))) FILE_SetDosError();
- RtlFreeAnsiString( &unix_name );
- NtClose( handle );
- return ret;
-}
-
-
-/***********************************************************************
- * RemoveDirectoryA (KERNEL32.@)
- */
-BOOL WINAPI RemoveDirectoryA( LPCSTR path )
-{
- WCHAR *pathW;
-
- if (!(pathW = FILE_name_AtoW( path, FALSE ))) return FALSE;
- return RemoveDirectoryW( pathW );
-}
-
-
/***********************************************************************
* GetSystemDirectoryW (KERNEL32.@)
*
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index bd87f75665..9d082f1a64 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -3448,6 +3448,50 @@ BOOL WINAPI DECLSPEC_HOTPATCH ReadFileScatter( HANDLE file, FILE_SEGMENT_ELEMENT
}
+/***********************************************************************
+ * RemoveDirectoryA (kernelbase.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH RemoveDirectoryA( LPCSTR path )
+{
+ WCHAR *pathW;
+
+ if (!(pathW = file_name_AtoW( path, FALSE ))) return FALSE;
+ return RemoveDirectoryW( pathW );
+}
+
+
+/***********************************************************************
+ * RemoveDirectoryW (kernelbase.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH RemoveDirectoryW( LPCWSTR path )
+{
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nt_name;
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+ HANDLE handle;
+
+ TRACE( "%s\n", debugstr_w(path) );
+
+ status = RtlDosPathNameToNtPathName_U_WithStatus( path, &nt_name, NULL, NULL );
+ if (!set_ntstatus( status )) return FALSE;
+
+ InitializeObjectAttributes( &attr, &nt_name, OBJ_CASE_INSENSITIVE, 0, NULL );
+ status = NtOpenFile( &handle, DELETE | SYNCHRONIZE, &attr, &io,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT );
+ RtlFreeUnicodeString( &nt_name );
+
+ if (!status)
+ {
+ FILE_DISPOSITION_INFORMATION info = { TRUE };
+ status = NtSetInformationFile( handle, &io, &info, sizeof(info), FileDispositionInformation );
+ NtClose( handle );
+ }
+ return set_ntstatus( status );
+}
+
+
/**************************************************************************
* SetEndOfFile (kernelbase.@)
*/
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 8c184ff4f4..3f778685a7 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1331,8 +1331,8 @@
@ stdcall ReleaseSemaphoreWhenCallbackReturns(ptr long long) ntdll.TpCallbackReleaseSemaphoreOnCompletion
# @ stub ReleaseStateLock
@ stdcall RemapPredefinedHandleInternal(long long)
-@ stdcall RemoveDirectoryA(str) kernel32.RemoveDirectoryA
-@ stdcall RemoveDirectoryW(wstr) kernel32.RemoveDirectoryW
+@ stdcall RemoveDirectoryA(str)
+@ stdcall RemoveDirectoryW(wstr)
@ stdcall RemoveDllDirectory(ptr)
# @ stub RemovePackageStatus
# @ stub RemovePackageStatusForUser
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 9e65a1f6dd..6164b0c4bd 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -3082,16 +3082,17 @@ todo_wine
fileDeleted = RemoveDirectoryA( buffer );
ok( fileDeleted, "Directory should have been deleted\n" );
fileDeleted = GetFileAttributesA( buffer ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND;
-todo_wine
ok( !fileDeleted, "Directory shouldn't have been deleted\n" );
res = nt_get_file_attrs( buffer, &fdi2 );
todo_wine
ok( res == STATUS_DELETE_PENDING, "got %#x\n", res );
/* can't open the deleted directory */
handle2 = CreateFileA(buffer, DELETE, FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+todo_wine
ok( handle2 == INVALID_HANDLE_VALUE, "CreateFile should fail\n" );
todo_wine
ok(GetLastError() == ERROR_ACCESS_DENIED, "got %u\n", GetLastError());
+ if (handle2 != INVALID_HANDLE_VALUE) CloseHandle( handle2 );
CloseHandle( handle );
fileDeleted = GetFileAttributesA( buffer ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND;
ok( fileDeleted, "Directory should have been deleted\n" );
More information about the wine-cvs
mailing list