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