Author: cwittich Date: Sat Jun 6 20:10:47 2009 New Revision: 41311
URL: http://svn.reactos.org/svn/reactos?rev=41311&view=rev Log: sync kernel32_winetest with wine 1.1.23
Modified: trunk/rostests/winetests/kernel32/comm.c trunk/rostests/winetests/kernel32/debugger.c trunk/rostests/winetests/kernel32/directory.c trunk/rostests/winetests/kernel32/drive.c trunk/rostests/winetests/kernel32/file.c trunk/rostests/winetests/kernel32/format_msg.c trunk/rostests/winetests/kernel32/heap.c trunk/rostests/winetests/kernel32/locale.c trunk/rostests/winetests/kernel32/module.c trunk/rostests/winetests/kernel32/path.c trunk/rostests/winetests/kernel32/process.c trunk/rostests/winetests/kernel32/profile.c trunk/rostests/winetests/kernel32/thread.c trunk/rostests/winetests/kernel32/virtual.c trunk/rostests/winetests/kernel32/volume.c
Modified: trunk/rostests/winetests/kernel32/comm.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/comm.c?... ============================================================================== --- trunk/rostests/winetests/kernel32/comm.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/comm.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -571,7 +571,10 @@ result = BuildCommDCBW(wide_string, &dcb);
if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("BuildCommDCBW is not available\n"); return; + }
/* check results */ check_result("BuildCommDCBW", ptest, initial_value, result); @@ -595,7 +598,10 @@ result = BuildCommDCBAndTimeoutsW(wide_string, &dcb, &timeouts);
if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("BuildCommDCBAndTimeoutsW is not available\n"); return; + }
/* check results */ check_result("BuildCommDCBAndTimeoutsA", ptest, initial_value, result);
Modified: trunk/rostests/winetests/kernel32/debugger.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/debugge... ============================================================================== --- trunk/rostests/winetests/kernel32/debugger.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/debugger.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -282,15 +282,16 @@ /* If, after attaching to the debuggee, the debugger exits without * detaching, then the debuggee gets a special exit code. */ - ok(exit_code == 0xffffffff || /* Win 9x */ - exit_code == 0x80 || /* NT4 */ - exit_code == STATUS_DEBUGGER_INACTIVE, /* Win >= XP */ + ok(exit_code == STATUS_DEBUGGER_INACTIVE || + broken(exit_code == 0xffffffff) || /* Win9x */ + broken(exit_code == WAIT_ABANDONED), /* NT4, W2K */ "wrong exit code : %08x\n", exit_code); } else - ok(exit_code == STATUS_ACCESS_VIOLATION || - exit_code == WAIT_ABANDONED, /* win2k3 */ - "exit code = %08x instead of STATUS_ACCESS_VIOLATION or WAIT_ABANDONED\n", exit_code); + ok(exit_code == STATUS_ACCESS_VIOLATION || + broken(exit_code == WAIT_ABANDONED) || /* NT4, W2K, W2K3 */ + broken(exit_code == 0xffffffff), /* Win9x, WinME */ + "wrong exit code : %08x\n", exit_code); CloseHandle(info.hProcess);
/* ...before the debugger */ @@ -412,8 +413,12 @@ crash_and_debug(hkey, test_exe, "dbg,attach,event,code2"); if (pDebugSetProcessKillOnExit) crash_and_debug(hkey, test_exe, "dbg,attach,event,nokill"); + else + win_skip("DebugSetProcessKillOnExit is not available\n"); if (pDebugActiveProcessStop) crash_and_debug(hkey, test_exe, "dbg,attach,event,detach"); + else + win_skip("DebugActiveProcessStop is not available\n");
if (disposition == REG_CREATED_NEW_KEY) {
Modified: trunk/rostests/winetests/kernel32/directory.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/directo... ============================================================================== --- trunk/rostests/winetests/kernel32/directory.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/directory.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -61,8 +61,11 @@ static const WCHAR fooW[] = {'f','o','o',0};
len_with_null = GetWindowsDirectoryW(NULL, 0); - if (len_with_null==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (len_with_null == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetWindowsDirectoryW is not implemented\n"); return; + } ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n");
lstrcpyW(buf, fooW); @@ -124,8 +127,11 @@ static const WCHAR fooW[] = {'f','o','o',0};
len_with_null = GetSystemDirectoryW(NULL, 0); - if (len_with_null==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (len_with_null == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetSystemDirectoryW is not available\n"); return; + } ok(len_with_null <= MAX_PATH, "should fit into MAX_PATH\n");
lstrcpyW(buf, fooW); @@ -337,8 +343,11 @@ static const WCHAR questionW[] = {'?',0};
ret = CreateDirectoryW(NULL, NULL); - if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("CreateDirectoryW is not available\n"); return; + } ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create NULL path ret %u err %u\n", ret, GetLastError());
@@ -441,8 +450,11 @@ GetTempPathW(MAX_PATH, tmpdir); lstrcatW(tmpdir, tmp_dir_name); ret = CreateDirectoryW(tmpdir, NULL); - if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) - return; + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("CreateDirectoryW is not available\n"); + return; + }
ok(ret == TRUE, "CreateDirectoryW should always succeed\n");
Modified: trunk/rostests/winetests/kernel32/drive.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/drive.c... ============================================================================== --- trunk/rostests/winetests/kernel32/drive.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/drive.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -39,7 +39,8 @@ for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) { type = GetDriveTypeA(drive); - ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type); + ok(type > DRIVE_UNKNOWN && type <= DRIVE_RAMDISK, + "not a valid drive %c: type %u\n", drive[0], type);
if (!(logical_drives & 1)) ok(type == DRIVE_NO_ROOT_DIR, @@ -62,12 +63,13 @@ for (drive[0] = 'A'; drive[0] <= 'Z'; drive[0]++) { type = GetDriveTypeW(drive); - if (type == DRIVE_UNKNOWN && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (type == DRIVE_UNKNOWN && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - /* Must be Win9x which doesn't support the Unicode functions */ + win_skip("GetDriveTypeW is not available on Win9x\n"); return; } - ok(type > 0 && type <= 6, "not a valid drive %c: type %u\n", drive[0], type); + ok(type > DRIVE_UNKNOWN && type <= DRIVE_RAMDISK, + "not a valid drive %c: type %u\n", drive[0], type);
if (!(logical_drives & 1)) ok(type == DRIVE_NO_ROOT_DIR, @@ -165,9 +167,9 @@ static const WCHAR unix_style_root_pathW[] = { '/', 0 };
ret = GetDiskFreeSpaceW(NULL, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters); - if (ret == 0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) - { - /* Must be Win9x which doesn't support the Unicode functions */ + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetDiskFreeSpaceW is not available\n"); return; } ok(ret, "GetDiskFreeSpaceW error %d\n", GetLastError());
Modified: trunk/rostests/winetests/kernel32/file.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/file.c?... ============================================================================== --- trunk/rostests/winetests/kernel32/file.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/file.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -26,6 +26,7 @@ #include <stdarg.h> #include <stdlib.h> #include <time.h> +#include <stdio.h>
#include "wine/test.h" #include "windef.h" @@ -36,6 +37,7 @@ static BOOL (WINAPI *pReplaceFileA)(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOID); static BOOL (WINAPI *pReplaceFileW)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID); static UINT (WINAPI *pGetSystemWindowsDirectoryA)(LPSTR, UINT); +static BOOL (WINAPI *pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD);
/* keep filename and filenameW the same */ static const char filename[] = "testfile.xxx"; @@ -52,6 +54,13 @@ "1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" "sdlkfjasdlkfj a dslkj adsklf \n \nasdklf askldfa sdlkf \nsadklf asdklf asdf ";
+struct test_list { + const char *file; + const DWORD err; + const DWORD options; + const BOOL todo_flag; +} ; + static void InitFunctionPointers(void) { HMODULE hkernel32 = GetModuleHandleA("kernel32"); @@ -60,6 +69,7 @@ pReplaceFileA=(void*)GetProcAddress(hkernel32, "ReplaceFileA"); pReplaceFileW=(void*)GetProcAddress(hkernel32, "ReplaceFileW"); pGetSystemWindowsDirectoryA=(void*)GetProcAddress(hkernel32, "GetSystemWindowsDirectoryA"); + pGetVolumeNameForVolumeMountPointA = (void *) GetProcAddress(hkernel32, "GetVolumeNameForVolumeMountPointA"); }
static void test__hread( void ) @@ -633,8 +643,11 @@ DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path); - if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetTempPathW is not available\n"); return; + } ok(ret != 0, "GetTempPathW error %d\n", GetLastError()); ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
@@ -657,13 +670,68 @@ ok(ret, "DeleteFileW: error %d\n", GetLastError()); }
+ +/* + * Debugging routine to dump a buffer in a hexdump-like fashion. + */ +static void dumpmem(unsigned char* mem, int len) { + int x,y; + char buf[200]; + int ln=0; + + for (x=0; x<len; x+=16) { + ln += sprintf(buf+ln, "%04x: ",x); + for (y=0; y<16; y++) { + if ((x+y)>len) { + ln += sprintf(buf+ln, " "); + } else { + ln += sprintf(buf+ln, "%02hhx ",mem[x+y]); + } + } + ln += sprintf(buf+ln, "- "); + for (y=0; y<16; y++) { + if ((x+y)<=len) { + if (mem[x+y]<32 || mem[x+y]>127) { + ln += sprintf(buf+ln, "."); + } else { + ln += sprintf(buf+ln, "%c",mem[x+y]); + } + } + } + sprintf(buf+ln, "\n"); + trace(buf); + ln = 0; + } +} + static void test_CreateFileA(void) { HANDLE hFile; - char temp_path[MAX_PATH]; + char temp_path[MAX_PATH], dirname[MAX_PATH]; char filename[MAX_PATH]; static const char prefix[] = "pfx"; - DWORD ret; + char windowsdir[MAX_PATH]; + char Volume_1[MAX_PATH]; + unsigned char buffer[512]; + char directory[] = "removeme"; + static const char nt_drive[] = "\\?\A:"; + DWORD i, ret, len; + struct test_list p[] = { + {"", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dir as file w \ */ + {"", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* dir as dir w \ */ + {"a", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist file */ + {"a\", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist dir */ + {"removeme", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* exist dir w/o \ */ + {"removeme\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* exst dir w \ */ + {"c:", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* device in file namespace */ + {"c:", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* device in file namespace as dir */ + {"c:\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* root dir w \ */ + {"c:\", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* root dir w \ as dir */ + {"\\?\c:", ERROR_SUCCESS, FILE_ATTRIBUTE_NORMAL,FALSE }, /* dev namespace drive */ + {"\\?\c:\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dev namespace drive w \ */ + {NULL, 0, 0, FALSE} + }; + BY_HANDLE_FILE_INFORMATION Finfo;
ret = GetTempPathA(MAX_PATH, temp_path); ok(ret != 0, "GetTempPathA error %d\n", GetLastError()); @@ -707,6 +775,263 @@
ret = DeleteFileA(filename); ok(ret, "DeleteFileA: error %d\n", GetLastError()); + + /* get windows drive letter */ + ret = GetWindowsDirectory(windowsdir, sizeof(windowsdir)); + ok(ret < sizeof(windowsdir), "windowsdir is abnormally long!\n"); + ok(ret != 0, "GetWindowsDirectory: error %d\n", GetLastError()); + + /* test error return codes from CreateFile for some cases */ + ret = GetTempPathA(MAX_PATH, temp_path); + ok(ret != 0, "GetTempPathA error %d\n", GetLastError()); + strcpy(dirname, temp_path); + strcat(dirname, directory); + ret = CreateDirectory(dirname, NULL); + ok( ret, "Createdirectory failed, gle=%d\n", GetLastError() ); + /* set current drive & directory to known location */ + SetCurrentDirectoryA( temp_path ); + i = 0; + while (p[i].file) + { + filename[0] = 0; + /* update the drive id in the table entry with the current one */ + if (p[i].file[1] == ':') + { + strcpy(filename, p[i].file); + filename[0] = windowsdir[0]; + } + else if (p[i].file[0] == '\' && p[i].file[5] == ':') + { + strcpy(filename, p[i].file); + filename[4] = windowsdir[0]; + } + else + { + /* prefix the table entry with the current temp directory */ + strcpy(filename, temp_path); + strcat(filename, p[i].file); + } + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + p[i].options, NULL ); + /* if we get ACCESS_DENIED when we do not expect it, assume + * no access to the volume + */ + if (hFile == INVALID_HANDLE_VALUE && + GetLastError() == ERROR_ACCESS_DENIED && + p[i].err != ERROR_ACCESS_DENIED) + { + if (p[i].todo_flag) + skip("Either no authority to volume, or is todo_wine for %s err=%d should be %d\n", filename, GetLastError(), p[i].err); + else + skip("Do not have authority to access volumes. Test for %s skipped\n", filename); + } + /* otherwise validate results with expectations */ + else if (p[i].todo_flag) + todo_wine ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || + (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), + "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", + filename, hFile, GetLastError(), p[i].err); + else + ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || + (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), + "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", + filename, hFile, GetLastError(), p[i].err); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + i++; + } + ret = RemoveDirectoryA(dirname); + ok(ret, "RemoveDirectoryA: error %d\n", GetLastError()); + + + /* test opening directory as a directory */ + hFile = CreateFileA( temp_path, GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL ); + ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_SUCCESS, + "CreateFileA did not work, last error %u on volume <%s>\n", + GetLastError(), temp_path ); + + if (hFile != INVALID_HANDLE_VALUE) + { + ret = GetFileInformationByHandle( hFile, &Finfo ); + if (ret) + { + ok(Finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY, + "CreateFileA probably did not open temp directory %s correctly\n file information does not include FILE_ATTRIBUTE_DIRECTORY, actual=0x%08x\n", + temp_path, Finfo.dwFileAttributes); + } + CloseHandle( hFile ); + } + + + /* *** Test opening volumes/devices using drive letter *** */ + + /* test using drive letter in non-rewrite format without trailing \ */ + /* this should work */ + strcpy(filename, nt_drive); + filename[4] = windowsdir[0]; + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); + if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) + { + /* if we have adm rights to volume, then try rest of tests */ + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + { + /* if we opened the volume/device, try to read it. Since it */ + /* opened, we should be able to read it. We don't care about*/ + /* what the data is at this time. */ + len = 512; + ret = ReadFile( hFile, buffer, len, &len, NULL ); + todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", + GetLastError(), ret, filename); + if (ret) + { + trace("buffer is\n"); + dumpmem(buffer, 64); + } + CloseHandle( hFile ); + } + + /* test using drive letter with trailing \ and in non-rewrite */ + /* this should not work */ + strcpy(filename, nt_drive); + filename[4] = windowsdir[0]; + strcat( filename, "\" ); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + + /* test using temp path with trailing \ and in non-rewrite as dir */ + /* this should work */ + strcpy(filename, nt_drive); + filename[4] = 0; + strcat( filename, temp_path ); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL ); + ok(hFile != INVALID_HANDLE_VALUE, + "CreateFileA should have worked on %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + + /* test using drive letter without trailing \ and in device ns */ + /* this should work */ + strcpy(filename, nt_drive); + filename[4] = windowsdir[0]; + filename[2] = '.'; + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + } + else + skip("Do not have authority to access volumes. Tests skipped\n"); + + + /* *** Test opening volumes/devices using GUID *** */ + + if (pGetVolumeNameForVolumeMountPointA) + { + strcpy(filename, "c:\"); + filename[0] = windowsdir[0]; + ret = pGetVolumeNameForVolumeMountPointA( filename, Volume_1, MAX_PATH ); + ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); + ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name %s\n", Volume_1); + + /* test the result of opening a unique volume name (GUID) */ + /* with the trailing \ */ + /* this should error out */ + strcpy(filename, Volume_1); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE, + "CreateFileA should not have opened %s, hFile %p\n", + filename, hFile); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + + /* test the result of opening a unique volume name (GUID) */ + /* with the temp path string as dir */ + /* this should work */ + strcpy(filename, Volume_1); + strcat(filename, temp_path+3); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL ); + todo_wine + ok(hFile != INVALID_HANDLE_VALUE, + "CreateFileA should have opened %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); + + /* test the result of opening a unique volume name (GUID) */ + /* without the trailing \ and in device namespace */ + /* this should work */ + strcpy(filename, Volume_1); + filename[2] = '.'; + filename[48] = 0; + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); + if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) + { + /* if we have adm rights to volume, then try rest of tests */ + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + { + /* if we opened the volume/device, try to read it. Since it */ + /* opened, we should be able to read it. We don't care about*/ + /* what the data is at this time. */ + len = 512; + ret = ReadFile( hFile, buffer, len, &len, NULL ); + todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", + GetLastError(), ret, filename); + if (ret) + { + trace("buffer is\n"); + dumpmem(buffer, 64); + } + CloseHandle( hFile ); + } + } + else + skip("Do not have authority to access volumes. Tests skipped\n"); + } + else + win_skip("GetVolumeNameForVolumeMountPointA not found\n"); }
static void test_CreateFileW(void) @@ -720,8 +1045,11 @@ DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path); - if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetTempPathW is not available\n"); return; + } ok(ret != 0, "GetTempPathW error %d\n", GetLastError()); ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
@@ -864,8 +1192,11 @@ static const WCHAR emptyW[]={'\0'};
ret = DeleteFileW(NULL); - if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("DeleteFileW is not available\n"); return; + } ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, "DeleteFileW(NULL) returned ret=%d error=%d\n",ret,GetLastError());
@@ -984,8 +1315,11 @@ DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path); - if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetTempPathW is not available\n"); return; + } ok(ret != 0, "GetTempPathW error %d\n", GetLastError()); ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
@@ -1364,7 +1698,12 @@
/* try FindFirstFileA on "C:\foo" */ SetLastError( 0xdeadbeaf ); - GetTempFileNameA( buffer, "foo", 0, nonexistent ); + if (!GetTempFileNameA( buffer, "foo", 0, nonexistent ) && GetLastError() == ERROR_ACCESS_DENIED) + { + char tmp[MAX_PATH]; + GetTempPathA( sizeof(tmp), tmp ); + GetTempFileNameA( tmp, "foo", 0, nonexistent ); + } DeleteFileA( nonexistent ); strcpy(buffer2, nonexistent); strcat(buffer2, "\"); @@ -2352,8 +2691,11 @@ }
ret = GetTempPathW(MAX_PATH, temp_path); - if (ret==0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetTempPathW is not available\n"); return; + } ok(ret != 0, "GetTempPathW error %d\n", GetLastError()); ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
Modified: trunk/rostests/winetests/kernel32/format_msg.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/format_... ============================================================================== --- trunk/rostests/winetests/kernel32/format_msg.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/format_msg.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -1,4 +1,4 @@ -/* Unit test suite for FormatMessageA +/* Unit test suite for FormatMessageA/W * * Copyright 2002 Mike McCormack for CodeWeavers * @@ -22,6 +22,7 @@ #include "wine/test.h" #include "windef.h" #include "winbase.h" +#include "winnls.h"
/* #define ok(cond,failstr) if(!(cond)) {printf("line %d : %s\n",__LINE__,failstr);exit(1);} */
@@ -38,6 +39,297 @@ return r; }
+static DWORD doitW(DWORD flags, LPCVOID src, DWORD msg_id, DWORD lang_id, + LPWSTR out, DWORD outsize, ... ) +{ + va_list list; + DWORD r; + + va_start(list, outsize); + r = FormatMessageW(flags, src, msg_id, + lang_id, out, outsize, &list); + va_end(list); + return r; +} + +static char buf[1024]; +static const char *debugstr_w(const WCHAR *str) +{ + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + +static void test_message_from_string_wide(void) +{ + static const WCHAR test[] = {'t','e','s','t',0}; + static const WCHAR te[] = {'t','e',0}; + static const WCHAR st[] = {'s','t',0}; + static const WCHAR t[] = {'t',0}; + static const WCHAR e[] = {'e',0}; + static const WCHAR s[] = {'s',0}; + static const WCHAR fmt_1[] = {'%','1',0}; + static const WCHAR fmt_12[] = {'%','1','%','2',0}; + static const WCHAR fmt_123[] = {'%','1','%','3','%','2','%','1',0}; + static const WCHAR fmt_123c[] = {'%','1','!','c','!','%','2','!','c','!','%','3','!','c','!','%','1','!','c','!',0}; + static const WCHAR fmt_123lc[] = {'%','1','!','l','c','!','%','2','!','l','c','!','%','3','!','l','c','!','%','1','!','l','c','!',0}; + static const WCHAR fmt_123wc[] = {'%','1','!','w','c','!','%','2','!','w','c','!','%','3','!','w','c','!','%','1','!','w','c','!',0}; + static const WCHAR fmt_123C[] = {'%','1','!','C','!','%','2','!','C','!','%','3','!','C','!','%','1','!','C','!',0}; + static const WCHAR fmt_123d[] = {'%','1','!','d','!','%','2','!','d','!','%','3','!','d','!',0}; + static const WCHAR fmt_1s[] = {'%','1','!','s','!',0}; + static const WCHAR fmt_s[] = {'%','!','s','!',0}; + static const WCHAR fmt_ls[] = {'%','!','l','s','!',0}; + static const WCHAR fmt_ws[] = {'%','!','w','s','!',0}; + static const WCHAR fmt_S[] = {'%','!','S','!',0}; + static const WCHAR fmt_14d[] = {'%','1','!','4','d','!',0}; + static const WCHAR fmt_14x[] = {'%','1','!','4','x','!',0}; + static const WCHAR fmt_14X[] = {'%','1','!','4','X','!',0}; + static const WCHAR fmt_1_4X[] = {'%','1','!','-','4','X','!',0}; + static const WCHAR fmt_1_4d[] = {'%','1','!','-','4','d','!',0}; + static const WCHAR fmt_2pct[] = {' ','%','%','%','%',' ',0}; + static const WCHAR fmt_2dot1d[] = {' ', '%','.','%','.',' ',' ','%','1','!','d','!',0}; + static const WCHAR fmt_t0t[] = {'t','e','s','t','%','0','t','e','s','t',0}; + static const WCHAR fmt_yah[] = {'y','a','h','%','!','%','0',' ',' ',' ',0}; + static const WCHAR fmt_space[] = {'%',' ','%',' ',' ',' ',0}; + static const WCHAR fmt_hi_lf[] = {'h','i','\n',0}; + static const WCHAR fmt_hi_crlf[] = {'h','i','\r','\n',0}; + static const WCHAR fmt_cr[] = {'\r',0}; + static const WCHAR fmt_crcrlf[] = {'\r','\r','\n',0}; + static const WCHAR s_123d[] = {'1','2','3',0}; + static const WCHAR s_14d[] = {' ',' ',' ','1',0}; + static const WCHAR s_14x[] = {' ',' ',' ','b',0}; + static const WCHAR s_14X[] = {' ',' ',' ','B',0}; + static const WCHAR s_1_4X[] = {'B',' ',' ',' ',0}; + static const WCHAR s_14d2[] = {' ',' ','1','1',0}; + static const WCHAR s_1_4d[] = {'1',' ',' ',' ',0}; + static const WCHAR s_1AB[] = {' ','1','A','B',0}; + static const WCHAR s_2pct[] = {' ','%','%',' ',0}; + static const WCHAR s_2dot147[] = {' ','.','.',' ',' ','4','2','7',0}; + static const WCHAR s_yah[] = {'y','a','h','!',0}; + static const WCHAR s_space[] = {' ',' ',' ',' ',0}; + static const WCHAR s_hi_crlf[] = {'h','i','\r','\n',0}; + static const WCHAR s_crlf[] = {'\r','\n',0}; + static const WCHAR s_crlfcrlf[] = {'\r','\n','\r','\n',0}; + static const WCHAR s_hi_sp[] = {'h','i',' ',0}; + static const WCHAR s_sp[] = {' ',0}; + static const WCHAR s_2sp[] = {' ',' ',0}; + WCHAR out[0x100] = {0}; + DWORD r, error; + + SetLastError(0xdeadbeef); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0, 0, NULL, 0, NULL); + error = GetLastError(); + if (!r && error == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("FormatMessageW is not implemented\n"); + return; + } + + /* the basics */ + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4, "failed: r=%d\n", r); + + /* using the format feature */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1s, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* no format */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* two pieces */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_12, 0, + 0, out, sizeof(out)/sizeof(WCHAR), te, st); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* three pieces */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123, 0, + 0, out, sizeof(out)/sizeof(WCHAR), t, s, e); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* s doesn't seem to work in format strings */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_s, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(&fmt_s[1], out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==3, "failed: r=%d\n", r); + + /* nor ls */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ls, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(&fmt_ls[1], out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4, "failed: r=%d\n", r); + + /* nor S */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_S, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(&fmt_S[1], out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==3, "failed: r=%d\n", r); + + /* nor ws */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ws, 0, + 0, out, sizeof(out)/sizeof(WCHAR), test); + ok(!lstrcmpW(&fmt_ws[1], out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4, "failed: r=%d\n", r); + + /* as characters */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123c, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's'); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* lc is unicode */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123lc, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's'); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* wc is unicode */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123wc, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's'); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* C is unicode */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123C, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's'); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* some numbers */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123d, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 1, 2, 3); + ok(!lstrcmpW(s_123d, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==3,"failed: r=%d\n", r); + + /* a single digit with some spacing */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 1); + ok(!lstrcmpW(s_14d, out), "failed out=[%s]\n", debugstr_w(out)); + + /* a single digit, left justified */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4d, 0, + 0, out, sizeof(out)/sizeof(CHAR), 1); + ok(!lstrcmpW(s_1_4d, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* two digit decimal number */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 11); + ok(!lstrcmpW(s_14d2, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* a hex number */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14x, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 11); + ok(!lstrcmpW(s_14x, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* a hex number, upper case */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 11); + ok(!lstrcmpW(s_14X, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* a hex number, upper case, left justified */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4X, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 11); + ok(!lstrcmpW(s_1_4X, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* a long hex number, upper case */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 0x1ab); + ok(!lstrcmpW(s_1AB, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* two percent... */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2pct, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_2pct, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* periods are special cases */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2dot1d, 0, + 0, out, sizeof(out)/sizeof(WCHAR), 0x1ab); + ok(!lstrcmpW(s_2dot147, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==8,"failed: r=%d\n", r); + + /* %0 ends the line */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_t0t, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(test, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* %! prints an exclamation */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_yah, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_yah, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* %space */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_space, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_space, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_lf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_hi_crlf, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* carriage return line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_crlf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_hi_crlf, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* carriage return */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_cr, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_crlf, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==2,"failed: r=%d\n", r); + + /* double carriage return line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_crcrlf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_crlfcrlf, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + + /* change of pace... test the low byte of dwflags */ + + /* line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_lf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_hi_sp, out) || !lstrcmpW(s_hi_crlf, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==3 || r==4,"failed: r=%d\n", r); + + /* carriage return line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_crlf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_hi_sp, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==3,"failed: r=%d\n", r); + + /* carriage return */ + r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_cr, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_sp, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==1,"failed: r=%d\n", r); + + /* double carriage return line feed */ + r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_crcrlf, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_2sp, out), "failed out=[%s]\n", debugstr_w(out)); + ok(r==2,"failed: r=%d\n", r); +} + static void test_message_from_string(void) { CHAR out[0x100] = {0}; @@ -80,14 +372,44 @@ ok(!strcmp("!s!", out),"failed out=[%s]\n",out); ok(r==3,"failed: r=%d\n",r);
+ /* ls is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ls!", 0, + 0, out, sizeof(out)/sizeof(CHAR), szwTest); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + /* S is unicode */ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!S!", 0, 0, out, sizeof(out)/sizeof(CHAR), szwTest); ok(!strcmp("test", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r);
+ /* ws is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ws!", 0, + 0, out, sizeof(out)/sizeof(CHAR), szwTest); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + /* as characters */ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!c!%2!c!%3!c!%1!c!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 't','e','s'); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + + /* lc is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!lc!%2!lc!%3!lc!%1!lc!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 't','e','s'); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + + /* wc is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!wc!%2!wc!%3!wc!%1!wc!", 0, + 0, out, sizeof(out)/sizeof(CHAR), 't','e','s'); + ok(!strcmp("test", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + + /* C is unicode */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!C!%2!C!%3!C!%1!C!", 0, 0, out, sizeof(out)/sizeof(CHAR), 't','e','s'); ok(!strcmp("test", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r); @@ -182,19 +504,20 @@ ok(!strcmp("hi\r\n", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r);
- /* carriage return line feed */ + /* carriage return */ r = doit(FORMAT_MESSAGE_FROM_STRING, "\r", 0, 0, out, sizeof(out)/sizeof(CHAR)); ok(!strcmp("\r\n", out),"failed out=[%s]\n",out); ok(r==2,"failed: r=%d\n",r);
- /* carriage return line feed */ + /* double carriage return line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING, "\r\r\n", 0, 0, out, sizeof(out)/sizeof(CHAR)); ok(!strcmp("\r\n\r\n", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r);
/* change of pace... test the low byte of dwflags */ + /* line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, 0, out, sizeof(out)/sizeof(CHAR)); @@ -207,13 +530,13 @@ ok(!strcmp("hi ", out),"failed out=[%s]\n",out); ok(r==3,"failed: r=%d\n",r);
- /* carriage return line feed */ + /* carriage return */ r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0, 0, out, sizeof(out)/sizeof(CHAR)); ok(!strcmp(" ", out),"failed out=[%s]\n",out); ok(r==1,"failed: r=%d\n",r);
- /* carriage return line feed */ + /* double carriage return line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0, 0, out, sizeof(out)/sizeof(CHAR)); ok(!strcmp(" ", out),"failed out=[%s]\n",out); @@ -248,5 +571,6 @@ START_TEST(format_msg) { test_message_from_string(); + test_message_from_string_wide(); test_message_null_buffer(); }
Modified: trunk/rostests/winetests/kernel32/heap.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/heap.c?... ============================================================================== --- trunk/rostests/winetests/kernel32/heap.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/heap.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -362,9 +362,58 @@ GlobalFree(gbl); }
+static void test_obsolete_flags(void) +{ + static struct { + UINT flags; + UINT globalflags; + } test_global_flags[] = { + {GMEM_FIXED | GMEM_NOTIFY, 0}, + {GMEM_FIXED | GMEM_DISCARDABLE, 0}, + {GMEM_MOVEABLE | GMEM_NOTIFY, 0}, + {GMEM_MOVEABLE | GMEM_DDESHARE, GMEM_DDESHARE}, + {GMEM_MOVEABLE | GMEM_NOT_BANKED, 0}, + {GMEM_MOVEABLE | GMEM_NODISCARD, 0}, + {GMEM_MOVEABLE | GMEM_DISCARDABLE, GMEM_DISCARDABLE}, + {GMEM_MOVEABLE | GMEM_DDESHARE | GMEM_DISCARDABLE | GMEM_LOWER | GMEM_NOCOMPACT | GMEM_NODISCARD | + GMEM_NOT_BANKED | GMEM_NOTIFY, GMEM_DDESHARE | GMEM_DISCARDABLE}, + }; + + unsigned int i; + HGLOBAL gbl; + UINT resultflags; + + UINT (WINAPI *pGlobalFlags)(HGLOBAL); + + pGlobalFlags = (void *) GetProcAddress(GetModuleHandleA("kernel32"), "GlobalFlags"); + + if (!pGlobalFlags) + { + win_skip("GlobalFlags is not available\n"); + return; + } + + for (i = 0; i < sizeof(test_global_flags)/sizeof(test_global_flags[0]); i++) + { + gbl = GlobalAlloc(test_global_flags[i].flags, 4); + ok(gbl != NULL, "GlobalAlloc failed\n"); + + SetLastError(MAGIC_DEAD); + resultflags = pGlobalFlags(gbl); + + ok( resultflags == test_global_flags[i].globalflags || + broken(resultflags == (test_global_flags[i].globalflags & ~GMEM_DDESHARE)), /* win9x */ + "%u: expected 0x%08x, but returned 0x%08x with %d\n", + i, test_global_flags[i].globalflags, resultflags, GetLastError() ); + + GlobalFree(gbl); + } +} + START_TEST(heap) { test_heap(); + test_obsolete_flags();
/* Test both short and very long blocks */ test_sized_HeapAlloc(1);
Modified: trunk/rostests/winetests/kernel32/locale.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/locale.... ============================================================================== --- trunk/rostests/winetests/kernel32/locale.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/locale.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -118,25 +118,77 @@ static void test_GetLocaleInfoA(void) { int ret; + int len; LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); char buffer[BUFFER_SIZE]; + char expected[BUFFER_SIZE];
ok(lcid == 0x409, "wrong LCID calculated - %d\n", lcid); + + /* en, ar and zh use SUBLANG_NEUTRAL, but GetLocaleInfo assume SUBLANG_DEFAULT */ + memset(expected, 0, COUNTOF(expected)); + len = GetLocaleInfoA(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), LOCALE_SLANGUAGE, expected, COUNTOF(expected)); + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(LANG_ENGLISH, LOCALE_SLANGUAGE, buffer, COUNTOF(buffer)); + ok((ret == len) && !lstrcmpA(buffer, expected), + "got %d with '%s' (expected %d with '%s')\n", + ret, buffer, len, expected); + + memset(expected, 0, COUNTOF(expected)); + len = GetLocaleInfoA(MAKELANGID(LANG_ARABIC, SUBLANG_DEFAULT), LOCALE_SLANGUAGE, expected, COUNTOF(expected)); + if (len) { + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(LANG_ARABIC, LOCALE_SLANGUAGE, buffer, COUNTOF(buffer)); + ok((ret == len) && !lstrcmpA(buffer, expected), + "got %d with '%s' (expected %d with '%s')\n", + ret, buffer, len, expected); + } + else + win_skip("LANG_ARABIC not installed\n"); + + memset(expected, 0, COUNTOF(expected)); + len = GetLocaleInfoA(MAKELANGID(LANG_CHINESE, SUBLANG_DEFAULT), LOCALE_SLANGUAGE, expected, COUNTOF(expected)); + if (len) { + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(LANG_CHINESE, LOCALE_SLANGUAGE, buffer, COUNTOF(buffer)); + ok((ret == len) && !lstrcmpA(buffer, expected), + "got %d with '%s' (expected %d with '%s')\n", + ret, buffer, len, expected); + } + else + win_skip("LANG_CHINESE not installed\n"); + + /* SUBLANG_DEFAULT is required for mlang.dll, but optional for GetLocaleInfo */ + memset(expected, 0, COUNTOF(expected)); + len = GetLocaleInfoA(MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), LOCALE_SLANGUAGE, expected, COUNTOF(expected)); + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); + ret = GetLocaleInfoA(LANG_GERMAN, LOCALE_SLANGUAGE, buffer, COUNTOF(buffer)); + ok((ret == len) && !lstrcmpA(buffer, expected), + "got %d with '%s' (expected %d with '%s')\n", + ret, buffer, len, expected); +
/* HTMLKit and "Font xplorer lite" expect GetLocaleInfoA to * partially fill the buffer even if it is too short. See bug 637. */ - SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 0); ok(ret == 7 && !buffer[0], "Expected len=7, got %d\n", ret);
- SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 3); ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError()); ok(!strcmp(buffer, "Mon"), "Expected 'Mon', got '%s'\n", buffer);
- SetLastError(0); memset(buffer, 0, COUNTOF(buffer)); + SetLastError(0xdeadbeef); + memset(buffer, 0, COUNTOF(buffer)); ret = GetLocaleInfoA(lcid, NUO|LOCALE_SDAYNAME1, buffer, 10); ok(ret == 7, "Expected ret == 7, got %d, error %d\n", ret, GetLastError()); ok(!strcmp(buffer, "Monday"), "Expected 'Monday', got '%s'\n", buffer); @@ -432,7 +484,10 @@ ret = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, DATE_LONGDATE, NULL, input, buffer, COUNTOF(buffer)); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - return; + { + win_skip("GetDateFormatW is not implemented\n"); + return; + } ok(!ret && GetLastError() == ERROR_INVALID_FLAGS, "Expected ERROR_INVALID_FLAGS, got %d\n", GetLastError()); EXPECT_EQW; @@ -1631,8 +1686,11 @@ /* MAP_FOLDDIGITS */ SetLastError(0); ret = pFoldStringA(MAP_FOLDDIGITS, digits_src, -1, dst, 256); - if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("FoldStringA is not implemented\n"); return; + } ok(ret == 4, "Expected ret == 4, got %d, error %d\n", ret, GetLastError()); ok(strcmp(dst, digits_dst) == 0, "MAP_FOLDDIGITS: Expected '%s', got '%s'\n", digits_dst, dst);
Modified: trunk/rostests/winetests/kernel32/module.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/module.... ============================================================================== --- trunk/rostests/winetests/kernel32/module.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/module.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -249,10 +249,24 @@ SetLastError(0xdeadbeef); hmodule = LoadLibraryExA("testfile.dll", hfile, 0); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); - ok(GetLastError() == ERROR_SHARING_VIOLATION || - GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */ - GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ - "Unexpected last error, got %d\n", GetLastError()); + todo_wine + { + ok(GetLastError() == ERROR_SHARING_VIOLATION || + GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */ + GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ + "Unexpected last error, got %d\n", GetLastError()); + } + + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("testfile.dll", (HANDLE)0xdeadbeef, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + todo_wine + { + ok(GetLastError() == ERROR_SHARING_VIOLATION || + GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */ + GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ + "Unexpected last error, got %d\n", GetLastError()); + }
/* try to open a file that is locked */ SetLastError(0xdeadbeef); @@ -304,6 +318,12 @@ GetLastError() == ERROR_SUCCESS, /* win9x */ "Expected 0xdeadbeef or ERROR_SUCCESS, got %d\n", GetLastError());
+ /* try invalid file handle */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA(path, (HANDLE)0xdeadbeef, 0); + if (!hmodule) /* succeeds on xp and older */ + ok(GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError()); + CloseHandle(hmodule);
/* load kernel32.dll with no path */
Modified: trunk/rostests/winetests/kernel32/path.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/path.c?... ============================================================================== --- trunk/rostests/winetests/kernel32/path.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/path.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -878,8 +878,11 @@
lstrcpyW(buf, fooW); len = GetTempPathW(MAX_PATH, buf); - if (len==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) + if (len == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetTempPathW is not available\n"); return; + } ok(lstrcmpiW(buf, tmp_dirW) == 0, "GetTempPathW returned an incorrect temporary path\n"); ok(len == lstrlenW(buf), "returned length should be equal to the length of string\n");
Modified: trunk/rostests/winetests/kernel32/process.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/process... ============================================================================== --- trunk/rostests/winetests/kernel32/process.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/process.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -388,7 +388,7 @@ ret = SetConsoleCP(1252); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("Setting the codepage is not implemented"); + win_skip("Setting the codepage is not implemented\n"); } else { @@ -927,6 +927,72 @@ okChildStringWA("Arguments", "CommandLineW", buffer2); release_memory(); assert(DeleteFileA(resfile) != 0); + + if (0) /* Test crashes on NT-based Windows. */ + { + /* Test NULL application name and command line parameters. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(NULL, NULL, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } + + buffer[0] = '\0'; + + /* Test empty application name parameter. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(buffer, NULL, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_PATH_NOT_FOUND || + broken(GetLastError() == ERROR_FILE_NOT_FOUND) /* Win9x/WinME */ || + broken(GetLastError() == ERROR_ACCESS_DENIED) /* Win98 */, + "Expected ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); + + buffer2[0] = '\0'; + + /* Test empty application name and command line parameters. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(buffer, buffer2, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_PATH_NOT_FOUND || + broken(GetLastError() == ERROR_FILE_NOT_FOUND) /* Win9x/WinME */ || + broken(GetLastError() == ERROR_ACCESS_DENIED) /* Win98 */, + "Expected ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); + + /* Test empty command line parameter. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(NULL, buffer2, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_PATH_NOT_FOUND /* NT4 */ || + GetLastError() == ERROR_BAD_PATHNAME /* Win98 */, + "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + + strcpy(buffer, "doesnotexist.exe"); + strcpy(buffer2, "does not exist.exe"); + + /* Test nonexistent application name. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(buffer, NULL, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = CreateProcessA(buffer2, NULL, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + + /* Test nonexistent command line parameter. */ + SetLastError(0xdeadbeef); + ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = CreateProcessA(NULL, buffer2, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); + ok(!ret, "CreateProcessA unexpectedly succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); }
static void test_Directory(void)
Modified: trunk/rostests/winetests/kernel32/profile.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/profile... ============================================================================== --- trunk/rostests/winetests/kernel32/profile.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/profile.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -822,17 +822,11 @@ DeleteFileA(filename); }
-static DWORD timeout = 0; - static BOOL check_binary_file_data(LPCSTR path, const VOID *data, DWORD size) { HANDLE file; CHAR buf[MAX_PATH]; BOOL ret; - - /* Sleep() is needed on Win9x and WinME */ - if (timeout) - Sleep(timeout);
file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (file == INVALID_HANDLE_VALUE) @@ -863,6 +857,19 @@ LPCSTR data; CHAR path[MAX_PATH]; CHAR temp[MAX_PATH]; + + SetLastError(0xdeadbeef); + ret = WritePrivateProfileStringW(NULL, NULL, NULL, NULL); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + /* Win9x/WinME needs (variable) timeouts between tests and even long timeouts don't + * guarantee a correct result. + * Win9x/WinMe also produces different ini files where there is always a newline before + * a section start (except for the first one). + */ + win_skip("WritePrivateProfileString on Win9x/WinME is hard to test reliably\n"); + return; + }
GetTempPathA(MAX_PATH, temp); GetTempFileNameA(temp, "wine", 0, path); @@ -878,8 +885,6 @@ broken(GetLastError() == ERROR_INVALID_PARAMETER) || /* NT4 */ broken(GetLastError() == 0xdeadbeef), /* Win9x and WinME */ "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); - if (GetLastError() == 0xdeadbeef) - timeout = 1000; ok(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES, "Expected path to not exist\n");
Modified: trunk/rostests/winetests/kernel32/thread.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/thread.... ============================================================================== --- trunk/rostests/winetests/kernel32/thread.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/thread.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -693,7 +693,10 @@ SetLastError(0xdeadbeef); rc=pGetThreadPriorityBoost(curthread,&disabled); if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) - return; /* WinME */ + { + win_skip("GetThreadPriorityBoost is not implemented on WinME\n"); + return; + }
todo_wine ok(rc!=0,"error=%d\n",GetLastError()); @@ -755,7 +758,10 @@ /* GetThreadTimes should set all of the parameters passed to it */ error=GetThreadTimes(thread,&creationTime,&exitTime, &kernelTime,&userTime); - if (error!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { + + if (error == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + win_skip("GetThreadTimes is not implemented\n"); + else { ok(error!=0,"GetThreadTimes failed\n"); ok(creationTime.dwLowDateTime!=99 || creationTime.dwHighDateTime!=99, "creationTime was invalid\n");
Modified: trunk/rostests/winetests/kernel32/virtual.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/virtual... ============================================================================== --- trunk/rostests/winetests/kernel32/virtual.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/virtual.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -328,7 +328,7 @@ { static const char testfile[] = "testfile.xxx"; const char *name; - HANDLE file, mapping; + HANDLE file, mapping, map2; void *ptr, *ptr2; MEMORY_BASIC_INFORMATION info; BOOL ret; @@ -365,6 +365,39 @@ ptr = MapViewOfFile( mapping, FILE_MAP_WRITE, 0, 0, 4096 ); ok( ptr != NULL, "MapViewOfFile FILE_MAP_WRITE error %u\n", GetLastError() ); UnmapViewOfFile( ptr ); + + ret = DuplicateHandle( GetCurrentProcess(), mapping, GetCurrentProcess(), &map2, + FILE_MAP_READ|FILE_MAP_WRITE, FALSE, 0 ); + ok( ret, "DuplicateHandle failed error %u\n", GetLastError()); + ptr = MapViewOfFile( map2, FILE_MAP_WRITE, 0, 0, 4096 ); + ok( ptr != NULL, "MapViewOfFile FILE_MAP_WRITE error %u\n", GetLastError() ); + UnmapViewOfFile( ptr ); + CloseHandle( map2 ); + + ret = DuplicateHandle( GetCurrentProcess(), mapping, GetCurrentProcess(), &map2, + FILE_MAP_READ, FALSE, 0 ); + ok( ret, "DuplicateHandle failed error %u\n", GetLastError()); + ptr = MapViewOfFile( map2, FILE_MAP_WRITE, 0, 0, 4096 ); + if (!ptr) + { + ok( GetLastError() == ERROR_ACCESS_DENIED, "Wrong error %d\n", GetLastError() ); + CloseHandle( map2 ); + ret = DuplicateHandle( GetCurrentProcess(), mapping, GetCurrentProcess(), &map2, 0, FALSE, 0 ); + ok( ret, "DuplicateHandle failed error %u\n", GetLastError()); + ptr = MapViewOfFile( map2, 0, 0, 0, 4096 ); + ok( !ptr, "MapViewOfFile succeeded\n" ); + ok( GetLastError() == ERROR_ACCESS_DENIED, "Wrong error %d\n", GetLastError() ); + CloseHandle( map2 ); + ret = DuplicateHandle( GetCurrentProcess(), mapping, GetCurrentProcess(), &map2, + FILE_MAP_READ, FALSE, 0 ); + ok( ret, "DuplicateHandle failed error %u\n", GetLastError()); + ptr = MapViewOfFile( map2, 0, 0, 0, 4096 ); + ok( ptr != NULL, "MapViewOfFile NO_ACCESS error %u\n", GetLastError() ); + } + else win_skip( "no access checks on win9x\n" ); + + UnmapViewOfFile( ptr ); + CloseHandle( map2 ); CloseHandle( mapping );
/* read-only mapping */
Modified: trunk/rostests/winetests/kernel32/volume.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/volume.... ============================================================================== --- trunk/rostests/winetests/kernel32/volume.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/volume.c [iso-8859-1] Sat Jun 6 20:10:47 2009 @@ -67,7 +67,8 @@ }
for (;drivestr[0] <= 'z'; drivestr[0]++) { - ret = QueryDosDeviceA( drivestr, buffer, buflen); + /* Older W2K fails with ERROR_INSUFFICIENT_BUFFER when buflen is > 32767 */ + ret = QueryDosDeviceA( drivestr, buffer, buflen - 1); if(ret) { for (p = buffer; *p; p++) *p = toupper(*p); if (strstr(buffer, "HARDDISK") || strstr(buffer, "RAMDISK")) found = TRUE; @@ -114,7 +115,8 @@ { BOOL ret; char volume[MAX_PATH], path[] = "c:\"; - DWORD len = sizeof(volume); + DWORD len = sizeof(volume), reti; + char temp_path[MAX_PATH];
/* not present before w2k */ if (!pGetVolumeNameForVolumeMountPointA) { @@ -122,8 +124,15 @@ return; }
+ reti = GetTempPathA(MAX_PATH, temp_path); + ok(reti != 0, "GetTempPathA error %d\n", GetLastError()); + ok(reti < MAX_PATH, "temp path should fit into MAX_PATH\n"); + ret = pGetVolumeNameForVolumeMountPointA(path, volume, 0); ok(ret == FALSE, "GetVolumeNameForVolumeMountPointA succeeded\n"); + ok(GetLastError() == ERROR_FILENAME_EXCED_RANGE || + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista */ + "wrong error, last=%d\n", GetLastError());
if (0) { /* these crash on XP */ ret = pGetVolumeNameForVolumeMountPointA(path, NULL, len); @@ -135,6 +144,43 @@
ret = pGetVolumeNameForVolumeMountPointA(path, volume, len); ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); + ok(!strncmp( volume, "\\?\Volume{", 11), + "GetVolumeNameForVolumeMountPointA failed to return valid string <%s>\n", + volume); + + /* test with too small buffer */ + ret = pGetVolumeNameForVolumeMountPointA(path, volume, 10); + ok(ret == FALSE && GetLastError() == ERROR_FILENAME_EXCED_RANGE, + "GetVolumeNameForVolumeMountPointA failed, wrong error returned, was %d, should be ERROR_FILENAME_EXCED_RANGE\n", + GetLastError()); + + /* Try on a arbitrary directory */ + ret = pGetVolumeNameForVolumeMountPointA(temp_path, volume, len); + ok(ret == FALSE && GetLastError() == ERROR_NOT_A_REPARSE_POINT, + "GetVolumeNameForVolumeMountPointA failed on %s, last=%d\n", + temp_path, GetLastError()); + + /* Try on a non-existent dos drive */ + path[2] = 0; + for (;path[0] <= 'z'; path[0]++) { + ret = QueryDosDeviceA( path, volume, len); + if(!ret) break; + } + if (path[0] <= 'z') + { + path[2] = '\'; + ret = pGetVolumeNameForVolumeMountPointA(path, volume, len); + ok(ret == FALSE && GetLastError() == ERROR_FILE_NOT_FOUND, + "GetVolumeNameForVolumeMountPointA failed on %s, last=%d\n", + path, GetLastError()); + + /* Try without trailing \ and on a non-existent dos drive */ + path[2] = 0; + ret = pGetVolumeNameForVolumeMountPointA(path, volume, len); + ok(ret == FALSE && GetLastError() == ERROR_INVALID_NAME, + "GetVolumeNameForVolumeMountPointA failed on %s, last=%d\n", + path, GetLastError()); + } }
static void test_GetVolumeNameForVolumeMountPointW(void) @@ -151,6 +197,9 @@
ret = pGetVolumeNameForVolumeMountPointW(path, volume, 0); ok(ret == FALSE, "GetVolumeNameForVolumeMountPointA succeeded\n"); + ok(GetLastError() == ERROR_FILENAME_EXCED_RANGE || + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista */ + "wrong error, last=%d\n", GetLastError());
if (0) { /* these crash on XP */ ret = pGetVolumeNameForVolumeMountPointW(path, NULL, len); @@ -340,7 +389,6 @@ /* get the unique volume name for the windows drive */ ret = pGetVolumeNameForVolumeMountPointA( path, Volume_1, MAX_PATH ); ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); -todo_wine ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name %s\n", Volume_1);
/* get first unique volume name of list */ @@ -358,7 +406,6 @@ break; } } while (pFindNextVolumeA( hFind, Volume_2, MAX_PATH )); -todo_wine ok(found, "volume name %s not found by Find[First/Next]Volume\n", Volume_1); pFindVolumeClose( hFind ); }