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