Module: wine Branch: master Commit: d9a27e9ca0d1dc0425032da788f5326f1f5ff737 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d9a27e9ca0d1dc0425032da788...
Author: Andrew Eikum aeikum@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);