Andrew Eikum : kernel32: Implement CheckNameLegalDOS8Dot3.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 13 10:25:31 CDT 2015


Module: wine
Branch: master
Commit: d9a27e9ca0d1dc0425032da788f5326f1f5ff737
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d9a27e9ca0d1dc0425032da788f5326f1f5ff737

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue May 12 13:31:01 2015 -0500

kernel32: Implement CheckNameLegalDOS8Dot3.

---

 dlls/kernel32/kernel32.spec |  4 +--
 dlls/kernel32/path.c        | 49 ++++++++++++++++++++++++++++++
 dlls/kernel32/tests/path.c  | 73 +++++++++++++++++++++++++++++++++++++++++++++
 include/winbase.h           |  2 ++
 4 files changed, 126 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 0809761..1261738 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -218,8 +218,8 @@
 # @ stub CheckElevation
 # @ stub CheckElevationEnabled
 # @ stub CheckForReadOnlyResource
-# @ stub CheckNameLegalDOS8Dot3A
-# @ stub CheckNameLegalDOS8Dot3W
+@ stdcall CheckNameLegalDOS8Dot3A(str ptr long ptr ptr)
+@ stdcall CheckNameLegalDOS8Dot3W(wstr ptr long ptr ptr)
 @ stdcall CheckRemoteDebuggerPresent(long ptr)
 @ stdcall ClearCommBreak(long)
 @ stdcall ClearCommError(long ptr ptr)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 179c8e0..eae2ca9 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -2012,3 +2012,52 @@ BOOL WINAPI CreateHardLinkTransactedW(LPCWSTR link, LPCWSTR target, LPSECURITY_A
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
+
+/*************************************************************************
+ *           CheckNameLegalDOS8Dot3A   (KERNEL32.@)
+ */
+BOOL WINAPI CheckNameLegalDOS8Dot3A(const char *name, char *oemname, DWORD oemname_len,
+        BOOL *contains_spaces, BOOL *is_legal)
+{
+    WCHAR *nameW;
+
+    TRACE("(%s %p %u %p %p)\n", name, oemname,
+            oemname_len, contains_spaces, is_legal);
+
+    if (!name || !is_legal)
+        return FALSE;
+
+    if (!(nameW = FILE_name_AtoW( name, FALSE ))) return FALSE;
+
+    return CheckNameLegalDOS8Dot3W( nameW, oemname, oemname_len, contains_spaces, is_legal );
+}
+
+/*************************************************************************
+ *           CheckNameLegalDOS8Dot3W   (KERNEL32.@)
+ */
+BOOL WINAPI CheckNameLegalDOS8Dot3W(const WCHAR *name, char *oemname, DWORD oemname_len,
+        BOOL *contains_spaces_ret, BOOL *is_legal)
+{
+    OEM_STRING oem_str;
+    UNICODE_STRING nameW;
+    BOOLEAN contains_spaces;
+
+    TRACE("(%s %p %u %p %p)\n", wine_dbgstr_w(name), oemname,
+          oemname_len, contains_spaces_ret, is_legal);
+
+    if (!name || !is_legal)
+        return FALSE;
+
+    RtlInitUnicodeString( &nameW, name );
+
+    if (oemname) {
+        oem_str.Length = oemname_len;
+        oem_str.MaximumLength = oemname_len;
+        oem_str.Buffer = oemname;
+    }
+
+    *is_legal = RtlIsNameLegalDOS8Dot3( &nameW, oemname ? &oem_str : NULL, &contains_spaces );
+    if (contains_spaces_ret) *contains_spaces_ret = contains_spaces;
+
+    return TRUE;
+}
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index de6d92a..3bf82fe 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -75,6 +75,9 @@ static BOOL   (WINAPI *pDeactivateActCtx)(DWORD,ULONG_PTR);
 static BOOL   (WINAPI *pGetCurrentActCtx)(HANDLE *);
 static void   (WINAPI *pReleaseActCtx)(HANDLE);
 
+static BOOL (WINAPI *pCheckNameLegalDOS8Dot3W)(const WCHAR *, char *, DWORD, BOOL *, BOOL *);
+static BOOL (WINAPI *pCheckNameLegalDOS8Dot3A)(const char *, char *, DWORD, BOOL *, BOOL *);
+
 /* a structure to deal with wine todos somewhat cleanly */
 typedef struct {
   DWORD shortlen;
@@ -2058,6 +2061,8 @@ static void init_pointers(void)
     MAKEFUNC(DeactivateActCtx);
     MAKEFUNC(GetCurrentActCtx);
     MAKEFUNC(ReleaseActCtx);
+    MAKEFUNC(CheckNameLegalDOS8Dot3W);
+    MAKEFUNC(CheckNameLegalDOS8Dot3A);
 #undef MAKEFUNC
 }
 
@@ -2119,6 +2124,73 @@ static void test_relative_path(void)
     RemoveDirectoryA("bar");
 }
 
+static void test_CheckNameLegalDOS8Dot3(void)
+{
+    static const WCHAR has_driveW[] = {'C',':','\\','a','.','t','x','t',0};
+    static const WCHAR has_pathW[] = {'b','\\','a','.','t','x','t',0};
+    static const WCHAR too_longW[] = {'a','l','o','n','g','f','i','l','e','n','a','m','e','.','t','x','t',0};
+    static const WCHAR twodotsW[] = {'t','e','s','t','.','e','s','t','.','t','x','t',0};
+    static const WCHAR longextW[] = {'t','e','s','t','.','t','x','t','t','x','t',0};
+    static const WCHAR emptyW[] = {0};
+    static const WCHAR funnycharsW[] = {'!','#','$','%','&','\'','(',')','.','-','@','^',0};
+    static const WCHAR length8W[] = {'t','e','s','t','t','e','s','t','.','t','x','t',0};
+    static const WCHAR length1W[] = {'t',0};
+    static const WCHAR withspaceW[] = {'t','e','s','t',' ','e','s','t','.','t','x','t',0};
+
+    static const struct {
+        const WCHAR *name;
+        BOOL should_be_legal, has_space;
+    } cases[] = {
+        {has_driveW, FALSE, FALSE},
+        {has_pathW, FALSE, FALSE},
+        {too_longW, FALSE, FALSE},
+        {twodotsW, FALSE, FALSE},
+        {longextW, FALSE, FALSE},
+        {emptyW, TRUE /* ! */, FALSE},
+        {funnycharsW, TRUE, FALSE},
+        {length8W, TRUE, FALSE},
+        {length1W, TRUE, FALSE},
+        {withspaceW, TRUE, TRUE},
+    };
+
+    BOOL br, is_legal, has_space;
+    char astr[64];
+    DWORD i;
+
+    if(!pCheckNameLegalDOS8Dot3W){
+        win_skip("Missing CheckNameLegalDOS8Dot3, skipping tests\n");
+        return;
+    }
+
+    br = pCheckNameLegalDOS8Dot3W(NULL, NULL, 0, NULL, &is_legal);
+    ok(br == FALSE, "CheckNameLegalDOS8Dot3W should have failed\n");
+
+    br = pCheckNameLegalDOS8Dot3A(NULL, NULL, 0, NULL, &is_legal);
+    ok(br == FALSE, "CheckNameLegalDOS8Dot3A should have failed\n");
+
+    br = pCheckNameLegalDOS8Dot3W(length8W, NULL, 0, NULL, NULL);
+    ok(br == FALSE, "CheckNameLegalDOS8Dot3W should have failed\n");
+
+    br = pCheckNameLegalDOS8Dot3A("testtest.txt", NULL, 0, NULL, NULL);
+    ok(br == FALSE, "CheckNameLegalDOS8Dot3A should have failed\n");
+
+    for(i = 0; i < sizeof(cases)/sizeof(*cases); ++i){
+        br = pCheckNameLegalDOS8Dot3W(cases[i].name, NULL, 0, &has_space, &is_legal);
+        ok(br == TRUE, "CheckNameLegalDOS8Dot3W failed for %s\n", wine_dbgstr_w(cases[i].name));
+        ok(is_legal == cases[i].should_be_legal, "Got wrong legality for %s\n", wine_dbgstr_w(cases[i].name));
+        if(is_legal)
+            ok(has_space == cases[i].has_space, "Got wrong space for %s\n", wine_dbgstr_w(cases[i].name));
+
+        WideCharToMultiByte(CP_ACP, 0, cases[i].name, -1, astr, sizeof(astr), NULL, NULL);
+
+        br = pCheckNameLegalDOS8Dot3A(astr, NULL, 0, &has_space, &is_legal);
+        ok(br == TRUE, "CheckNameLegalDOS8Dot3W failed for %s\n", astr);
+        ok(is_legal == cases[i].should_be_legal, "Got wrong legality for %s\n", astr);
+        if(is_legal)
+            ok(has_space == cases[i].has_space, "Got wrong space for %s\n", wine_dbgstr_w(cases[i].name));
+    }
+}
+
 START_TEST(path)
 {
     CHAR origdir[MAX_PATH],curdir[MAX_PATH], curDrive, otherDrive;
@@ -2151,4 +2223,5 @@ START_TEST(path)
     test_SearchPathW();
     test_GetFullPathNameA();
     test_GetFullPathNameW();
+    test_CheckNameLegalDOS8Dot3();
 }
diff --git a/include/winbase.h b/include/winbase.h
index f845082..a8f3fb6 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1614,6 +1614,8 @@ WINBASEAPI BOOL        WINAPI CancelIo(HANDLE);
 WINBASEAPI BOOL        WINAPI CancelIoEx(HANDLE,LPOVERLAPPED);
 WINBASEAPI BOOL        WINAPI CancelTimerQueueTimer(HANDLE,HANDLE);
 WINBASEAPI BOOL        WINAPI CancelWaitableTimer(HANDLE);
+WINBASEAPI BOOL        WINAPI CheckNameLegalDOS8Dot3A(const char*,char*,DWORD,BOOL*,BOOL*);
+WINBASEAPI BOOL        WINAPI CheckNameLegalDOS8Dot3W(const WCHAR*, char*,DWORD,BOOL*,BOOL*);
 WINBASEAPI BOOL        WINAPI ChangeTimerQueueTimer(HANDLE,HANDLE,ULONG,ULONG);
 WINADVAPI  BOOL        WINAPI CheckTokenMembership(HANDLE,PSID,PBOOL);
 WINBASEAPI BOOL        WINAPI ClearCommBreak(HANDLE);




More information about the wine-cvs mailing list