kernel32: Implement CreateSymbolicLinkA/W by reusing a modified IoCreateSymbolicLink
André Hentschel
nerv at dawncrow.de
Mon May 9 17:02:12 CDT 2011
Also for http://bugs.winehq.org/show_bug.cgi?id=27108
---
dlls/kernel32/file.c | 53 +++++++++++++++++++++++++++++++++++++++++++
dlls/kernel32/kernel32.spec | 2 +
include/winbase.h | 3 ++
3 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 6ee243e..945b949 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -1718,6 +1718,59 @@ BOOL WINAPI ReplaceFileA(LPCSTR lpReplacedFileName,LPCSTR lpReplacementFileName,
return ret;
}
+BOOL WINAPI CreateSymbolicLinkA (LPSTR link, LPSTR target, DWORD flags)
+{
+ HANDLE handle;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING linkstr, targetstr;
+
+ TRACE( "%s -> %s\n", debugstr_a(link), debugstr_a(target) );
+ if (flags) FIXME("ignoring flags: %u\n", flags);
+
+ RtlCreateUnicodeStringFromAsciiz(&linkstr, link);
+ RtlCreateUnicodeStringFromAsciiz(&targetstr, target);
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &linkstr;
+ attr.Attributes = OBJ_CASE_INSENSITIVE | OBJ_OPENIF;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ NtCreateSymbolicLinkObject( &handle, STANDARD_RIGHTS_REQUIRED | 0x1 /* SYMBOLIC_LINK_ALL_ACCESS */,
+ &attr, &targetstr );
+ RtlFreeUnicodeString(&linkstr);
+ RtlFreeUnicodeString(&targetstr);
+ /* FIXME: store handle somewhere */
+ return handle != INVALID_HANDLE_VALUE;
+}
+
+BOOL WINAPI CreateSymbolicLinkW (LPWSTR link, LPWSTR target, DWORD flags)
+{
+ HANDLE handle;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING linkstr, targetstr;
+
+ TRACE( "%s -> %s\n", debugstr_w(link), debugstr_w(target) );
+ if (flags) FIXME("ignoring flags: %u\n", flags);
+
+ RtlCreateUnicodeString(&linkstr, link);
+ RtlCreateUnicodeString(&targetstr, target);
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &linkstr;
+ attr.Attributes = OBJ_CASE_INSENSITIVE | OBJ_OPENIF;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ NtCreateSymbolicLinkObject( &handle, STANDARD_RIGHTS_REQUIRED | 0x1 /* SYMBOLIC_LINK_ALL_ACCESS */,
+ &attr, &targetstr );
+ RtlFreeUnicodeString(&linkstr);
+ RtlFreeUnicodeString(&targetstr);
+ /* FIXME: store handle somewhere */
+ return handle != INVALID_HANDLE_VALUE;
+}
/*************************************************************************
* FindFirstFileExW (KERNEL32.@)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 72ae13b..94327d0 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -256,6 +256,8 @@
@ stdcall CreateSemaphoreExW(ptr long long wstr long long)
@ stdcall CreateSemaphoreW(ptr long long wstr)
@ stdcall CreateSocketHandle()
+@ stdcall CreateSymbolicLinkA(ptr ptr long)
+@ stdcall CreateSymbolicLinkW(ptr ptr long)
@ stdcall CreateTapePartition(long long long long)
@ stdcall CreateThread(ptr long ptr long long ptr)
@ stdcall CreateTimerQueue ()
diff --git a/include/winbase.h b/include/winbase.h
index 2752e12..18ab03e 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1436,6 +1436,9 @@ WINBASEAPI HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES,LONG,LONG,L
WINBASEAPI HANDLE WINAPI CreateSemaphoreExA(SECURITY_ATTRIBUTES*,LONG,LONG,LPCSTR,DWORD,DWORD);
WINBASEAPI HANDLE WINAPI CreateSemaphoreExW(SECURITY_ATTRIBUTES*,LONG,LONG,LPCWSTR,DWORD,DWORD);
#define CreateSemaphoreEx WINELIB_NAME_AW(CreateSemaphoreEx)
+WINBASEAPI BOOL WINAPI CreateSymbolicLinkA(LPSTR, LPSTR, DWORD);
+WINBASEAPI BOOL WINAPI CreateSymbolicLinkW(LPWSTR, LPWSTR, DWORD);
+#define CreateSymbolicLink WINELIB_NAME_AW(CreateSymbolicLink)
WINBASEAPI DWORD WINAPI CreateTapePartition(HANDLE,DWORD,DWORD,DWORD);
WINBASEAPI HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
WINBASEAPI HANDLE WINAPI CreateTimerQueue(void);
--
Best Regards, André Hentschel
More information about the wine-patches
mailing list