From b4966b9a2f20502defd6ff1f5b9cdc22bac94475 Mon Sep 17 00:00:00 2001 From: Jan Zerebecki Date: Sat, 6 Sep 2008 13:14:36 +0200 Subject: [PATCH] push b0b97fcd59eff07f047585692fa36859b459324f --- .gitignore | 87 +-- configure | 18 +- configure.ac | 14 + dlls/advapi32/advapi32.spec | 2 +- dlls/advapi32/security.c | 13 + dlls/advapi32/tests/cred.c | 20 +- dlls/advapi32/tests/crypt_lmhash.c | 8 +- dlls/advapi32/tests/security.c | 24 +- dlls/advapi32/tests/service.c | 114 +--- dlls/comctl32/{comctl_Cn.rc => comctl_Zh.rc} | 56 +- dlls/comctl32/rsrc.rc | 2 +- dlls/comctl32/tests/comboex.c | 21 +- dlls/comctl32/tests/dpa.c | 4 +- dlls/comctl32/tests/listview.c | 7 +- dlls/comctl32/tests/tooltips.c | 7 + dlls/comctl32/tests/trackbar.c | 4 + dlls/comctl32/tests/updown.c | 1 + dlls/comdlg32/cdlg_Cn.rc | 442 ------------- dlls/comdlg32/cdlg_Zh.rc | 693 ++++++++++++++++---- dlls/comdlg32/rsrc.rc | 1 - dlls/crypt32/crl.c | 2 +- dlls/crypt32/crypt32.spec | 2 +- dlls/crypt32/decode.c | 169 +++++ dlls/crypt32/encode.c | 398 ++++++++++-- dlls/crypt32/message.c | 55 ++ dlls/crypt32/msg.c | 227 ++++--- dlls/crypt32/provstore.c | 4 +- dlls/crypt32/str.c | 44 +- dlls/crypt32/tests/cert.c | 6 +- dlls/crypt32/tests/encode.c | 736 +++++++++++++++++++++- dlls/crypt32/tests/message.c | 106 +++- dlls/crypt32/tests/msg.c | 61 +- dlls/crypt32/tests/oid.c | 5 +- dlls/crypt32/tests/str.c | 12 + dlls/cryptdlg/cryptdlg.spec | 4 +- dlls/cryptdlg/main.c | 18 + dlls/cryptui/cryptui.spec | 2 +- dlls/cryptui/main.c | 11 + dlls/d3d9/tests/visual.c | 78 +++ dlls/d3dxof/d3dxof.c | 4 +- dlls/d3dxof/tests/d3dxof.c | 9 +- dlls/ddraw/ddraw.c | 3 +- dlls/gdi32/tests/pen.c | 4 +- dlls/gdiplus/font.c | 101 ++- dlls/gdiplus/gdiplus.c | 22 + dlls/gdiplus/gdiplus.spec | 14 +- dlls/gdiplus/gdiplus_private.h | 17 +- dlls/gdiplus/graphics.c | 54 +- dlls/gdiplus/graphicspath.c | 131 +++- dlls/gdiplus/matrix.c | 3 + dlls/gdiplus/pathiterator.c | 43 ++ dlls/gdiplus/region.c | 92 +-- dlls/gdiplus/tests/font.c | 20 +- dlls/gdiplus/tests/graphics.c | 87 ++- dlls/gdiplus/tests/graphicspath.c | 75 +++ dlls/gdiplus/tests/pathiterator.c | 29 + dlls/gdiplus/tests/region.c | 152 ++++- dlls/iphlpapi/iphlpapi_main.c | 2 +- dlls/jscript/jscript_main.c | 2 +- dlls/kernel32/tests/codepage.c | 4 +- dlls/kernel32/tests/environ.c | 9 +- dlls/kernel32/tests/module.c | 106 ++++ dlls/kernel32/tests/process.c | 6 +- dlls/kernel32/tests/resource.c | 4 +- dlls/lz32/tests/lzexpand_main.c | 18 +- dlls/msi/source.c | 27 +- dlls/msi/tests/automation.c | 51 +- dlls/msi/tests/package.c | 160 +++++ dlls/msi/tests/source.c | 11 +- dlls/mstask/tests/task.c | 9 +- dlls/msvcrt/math.c | 9 +- dlls/msvcrt/tests/file.c | 14 + dlls/msxml3/dispex.c | 14 +- dlls/msxml3/saxreader.c | 4 +- dlls/msxml3/tests/domdoc.c | 33 + dlls/netapi32/tests/access.c | 2 +- dlls/ntdll/file.c | 3 + dlls/ntdll/tests/env.c | 6 +- dlls/ntdll/tests/info.c | 13 +- dlls/oleaut32/tests/typelib.c | 13 +- dlls/oleaut32/typelib.spec | 2 +- dlls/quartz/tests/filtergraph.c | 3 +- dlls/rasapi32/tests/rasapi.c | 4 + dlls/riched20/editor.c | 94 ++- dlls/riched20/editor.h | 1 + dlls/riched20/table.c | 42 +- dlls/rpcrt4/tests/ndr_marshall.c | 19 +- dlls/rpcrt4/tests/rpc.c | 8 + dlls/rpcrt4/tests/server.c | 5 +- dlls/shdocvw/dochost.c | 10 +- dlls/shell32/shell32_Cn.rc | 113 ---- dlls/shell32/shell32_Zh.rc | 188 ++++-- dlls/shell32/shres.rc | 1 - dlls/shlwapi/tests/path.c | 3 +- dlls/shlwapi/tests/url.c | 124 +++- dlls/shlwapi/url.c | 74 +-- dlls/user32/cursoricon.c | 54 +- dlls/user32/mdi.c | 9 +- dlls/user32/message.c | 6 - dlls/user32/misc.c | 5 +- dlls/user32/resources/user32_Zh.rc | 127 ++-- dlls/user32/tests/cursoricon.c | 97 ++- dlls/user32/tests/monitor.c | 126 +++- dlls/user32/tests/msg.c | 56 ++ dlls/user32/winproc.c | 6 + dlls/winealsa.drv/midi.c | 4 +- dlls/winealsa.drv/wavein.c | 6 +- dlls/winealsa.drv/waveinit.c | 4 +- dlls/winealsa.drv/waveout.c | 6 +- dlls/wined3d/arb_program_shader.c | 54 +- dlls/wined3d/ati_fragment_shader.c | 43 +- dlls/wined3d/basetexture.c | 21 - dlls/wined3d/context.c | 9 - dlls/wined3d/cubetexture.c | 7 - dlls/wined3d/device.c | 16 +- dlls/wined3d/directx.c | 34 +- dlls/wined3d/drawprim.c | 8 - dlls/wined3d/glsl_shader.c | 5 +- dlls/wined3d/nvidia_texture_shader.c | 6 +- dlls/wined3d/pixelshader.c | 8 - dlls/wined3d/state.c | 118 +--- dlls/wined3d/texture.c | 7 - dlls/wined3d/utils.c | 116 ++-- dlls/wined3d/vertexshader.c | 18 - dlls/wined3d/volumetexture.c | 7 - dlls/wined3d/wined3d_private.h | 28 +- dlls/winex11.drv/bitblt.c | 4 +- dlls/winex11.drv/bitmap.c | 6 +- dlls/winex11.drv/dib.c | 40 +- dlls/winex11.drv/window.c | 2 +- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/xinerama.c | 6 +- dlls/winhttp/net.c | 300 ++++++++- dlls/winhttp/request.c | 239 +++++++ dlls/winhttp/session.c | 8 +- dlls/winhttp/tests/winhttp.c | 89 +++ dlls/winhttp/winhttp.spec | 4 +- dlls/winhttp/winhttp_private.h | 6 +- dlls/wininet/http.c | 25 +- dlls/wininet/netconnection.c | 36 +- dlls/wininet/tests/http.c | 12 + include/cryptuiapi.h | 271 ++++++++ include/d3d9caps.h | 1 + include/d3drm.h | 2 +- include/d3drmobj.h | 3 + include/gdiplusflat.h | 9 + include/intshcut.h | 12 +- include/shobjidl.idl | 25 + include/winbase.h | 1 + include/wincrypt.h | 31 +- include/wine/wined3d_caps.h | 1 + include/wine/wined3d_interface.h | 8 - include/wine/wined3d_types.h | 2 + programs/clock/Zh.rc | 69 +- programs/explorer/systray.c | 15 + programs/notepad/Zh.rc | 333 ++++++---- programs/progman/Zh.rc | 417 +++++++++---- programs/regedit/childwnd.c | 6 +- programs/regedit/edit.c | 14 +- programs/regedit/framewnd.c | 109 ++-- programs/regedit/listview.c | 133 ++-- programs/regedit/main.c | 9 +- programs/regedit/main.h | 6 +- programs/regedit/regproc.c | 37 +- programs/winecfg/Zh.rc | 903 ++++++++++++++++++--------- programs/wineconsole/wineconsole_Zh.rc | 201 ++++-- programs/winefile/Zh.rc | 460 +++++++++----- programs/winetest/Makefile.in | 369 ++--------- programs/winetest/winetest.rc | 88 +-- programs/winhlp32/Zh.rc | 248 +++++--- tools/make_makefiles | 48 +- tools/widl/client.c | 8 + tools/widl/proxy.c | 5 + 173 files changed, 7921 insertions(+), 3261 deletions(-) rename dlls/comctl32/{comctl_Cn.rc => comctl_Zh.rc} (62%) delete mode 100644 dlls/comdlg32/cdlg_Cn.rc delete mode 100644 dlls/shell32/shell32_Cn.rc rewrite programs/notepad/Zh.rc (61%) rewrite programs/winecfg/Zh.rc (62%) rewrite programs/winefile/Zh.rc (70%) rewrite programs/winetest/Makefile.in (92%) rewrite programs/winhlp32/Zh.rc (62%) diff --git a/.gitignore b/.gitignore index 0f2152c1a7a..50351514356 100644 --- a/.gitignore +++ b/.gitignore @@ -257,92 +257,9 @@ programs/winefile/winefile programs/winemenubuilder/winemenubuilder programs/winemine/winemine programs/winepath/winepath -programs/winetest/advapi32_test.exe -programs/winetest/advpack_test.exe -programs/winetest/browseui_test.exe -programs/winetest/cabinet_test.exe -programs/winetest/comcat_test.exe -programs/winetest/comctl32_test.exe -programs/winetest/comdlg32_test.exe -programs/winetest/credui_test.exe -programs/winetest/crypt32_test.exe -programs/winetest/cryptnet_test.exe -programs/winetest/d3d8_test.exe -programs/winetest/d3d9_test.exe -programs/winetest/d3drm_test.exe -programs/winetest/d3dx8_test.exe -programs/winetest/d3dx9_36_test.exe -programs/winetest/d3dxof_test.exe -programs/winetest/ddraw_test.exe -programs/winetest/dinput_test.exe -programs/winetest/dnsapi_test.exe -programs/winetest/dplayx_test.exe -programs/winetest/dsound_test.exe -programs/winetest/fusion_test.exe -programs/winetest/gdi32_test.exe -programs/winetest/gdiplus_test.exe -programs/winetest/hlink_test.exe -programs/winetest/imm32_test.exe -programs/winetest/inetcomm_test.exe -programs/winetest/inetmib1_test.exe -programs/winetest/infosoft_test.exe -programs/winetest/iphlpapi_test.exe -programs/winetest/itss_test.exe -programs/winetest/jscript_test.exe -programs/winetest/kernel32_test.exe -programs/winetest/localspl_test.exe -programs/winetest/localui_test.exe -programs/winetest/lz32_test.exe -programs/winetest/mapi32_test.exe -programs/winetest/mlang_test.exe -programs/winetest/msacm32_test.exe -programs/winetest/mscms_test.exe -programs/winetest/mshtml_test.exe -programs/winetest/msi_test.exe -programs/winetest/mstask_test.exe -programs/winetest/msvcrt_test.exe -programs/winetest/msvcrtd_test.exe -programs/winetest/msxml3_test.exe -programs/winetest/netapi32_test.exe -programs/winetest/ntdll_test.exe -programs/winetest/ntdsapi_test.exe -programs/winetest/ntprint_test.exe -programs/winetest/odbccp32_test.exe -programs/winetest/ole32_test.exe -programs/winetest/oleaut32_test.exe -programs/winetest/opengl32_test.exe -programs/winetest/pdh_test.exe -programs/winetest/psapi_test.exe -programs/winetest/qedit_test.exe -programs/winetest/qmgr_test.exe -programs/winetest/quartz_test.exe -programs/winetest/rasapi32_test.exe -programs/winetest/riched20_test.exe -programs/winetest/riched32_test.exe -programs/winetest/rpcrt4_test.exe -programs/winetest/rsaenh_test.exe -programs/winetest/schannel_test.exe -programs/winetest/secur32_test.exe -programs/winetest/serialui_test.exe -programs/winetest/setupapi_test.exe -programs/winetest/shdocvw_test.exe -programs/winetest/shell32_test.exe -programs/winetest/shlwapi_test.exe -programs/winetest/snmpapi_test.exe -programs/winetest/spoolss_test.exe -programs/winetest/urlmon_test.exe -programs/winetest/user32_test.exe -programs/winetest/userenv_test.exe -programs/winetest/usp10_test.exe -programs/winetest/uxtheme_test.exe -programs/winetest/version_test.exe +programs/winetest/*_test.exe +programs/winetest/tests.rc programs/winetest/winetest -programs/winetest/winhttp_test.exe -programs/winetest/wininet_test.exe -programs/winetest/winmm_test.exe -programs/winetest/winspool.drv_test.exe -programs/winetest/wintrust_test.exe -programs/winetest/ws2_32_test.exe programs/winevdm/winevdm programs/winhlp32/macro.lex.yy.c programs/winhlp32/winhlp32 diff --git a/configure b/configure index 4da56dae70b..c8a4bb64711 100755 --- a/configure +++ b/configure @@ -782,6 +782,7 @@ ALL_TEST_DIRS ALL_PROGRAM_DIRS ALL_PROGRAM_INSTALL_DIRS ALL_PROGRAM_BIN_INSTALL_DIRS +ALL_WINETEST_DEPENDS LIBOBJS LTLIBOBJS' ac_subst_files='MAKE_RULES @@ -25670,6 +25671,20 @@ then fi + +ALL_WINETEST_DEPENDS="# Test binaries" + +for dir in $ALL_TEST_DIRS +do + if test "$dir" != "\\" + then + testname=`expr $dir : '\(.*\)/tests'`_test.exe + ALL_WINETEST_DEPENDS="$ALL_WINETEST_DEPENDS +$testname: \$(DLLDIR)/$dir/$testname\$(DLLEXT) + cp \$(DLLDIR)/$dir/$testname\$(DLLEXT) \$@ && \$(STRIP) \$@" + fi +done + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -26955,11 +26970,12 @@ ALL_TEST_DIRS!$ALL_TEST_DIRS$ac_delim ALL_PROGRAM_DIRS!$ALL_PROGRAM_DIRS$ac_delim ALL_PROGRAM_INSTALL_DIRS!$ALL_PROGRAM_INSTALL_DIRS$ac_delim ALL_PROGRAM_BIN_INSTALL_DIRS!$ALL_PROGRAM_BIN_INSTALL_DIRS$ac_delim +ALL_WINETEST_DEPENDS!$ALL_WINETEST_DEPENDS$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 87; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 88; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 diff --git a/configure.ac b/configure.ac index c3e80d30f3b..0a4679a1365 100644 --- a/configure.ac +++ b/configure.ac @@ -2136,6 +2136,20 @@ then AC_SUBST(ALL_TEST_DIRS,"") fi +dnl Build dependencies for test files compiled into winetest + +AC_SUBST(ALL_WINETEST_DEPENDS,["# Test binaries"]) +for dir in $ALL_TEST_DIRS +do + if test "$dir" != "\\" + then + testname=`expr $dir : '\(.*\)/tests'`_test.exe + ALL_WINETEST_DEPENDS="$ALL_WINETEST_DEPENDS +$testname: \$(DLLDIR)/$dir/$testname\$(DLLEXT) + cp \$(DLLDIR)/$dir/$testname\$(DLLEXT) \$@ && \$(STRIP) \$@" + fi +done + AC_OUTPUT if test "$no_create" = "yes" diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 4189458a7eb..cb4dd4d857a 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -87,7 +87,7 @@ @ stdcall ConvertStringSecurityDescriptorToSecurityDescriptorW(wstr long ptr ptr) @ stdcall ConvertStringSidToSidA(ptr ptr) @ stdcall ConvertStringSidToSidW(ptr ptr) -# @ stub ConvertToAutoInheritPrivateObjectSecurity +@ stdcall ConvertToAutoInheritPrivateObjectSecurity(ptr ptr ptr ptr long ptr) @ stdcall CopySid(long ptr ptr) # @ stub CreateCodeAuthzLevel @ stdcall CreatePrivateObjectSecurity(ptr ptr ptr long long ptr) diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 6a19ef01612..ef9ce6ea353 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -4553,6 +4553,19 @@ BOOL WINAPI ConvertSidToStringSidA(PSID pSid, LPSTR *pstr) return TRUE; } +BOOL WINAPI ConvertToAutoInheritPrivateObjectSecurity( + PSECURITY_DESCRIPTOR pdesc, + PSECURITY_DESCRIPTOR cdesc, + PSECURITY_DESCRIPTOR* ndesc, + GUID* objtype, + BOOL isdir, + PGENERIC_MAPPING genmap ) +{ + FIXME("%p %p %p %p %d %p - stub\n", pdesc, cdesc, ndesc, objtype, isdir, genmap); + + return FALSE; +} + BOOL WINAPI CreatePrivateObjectSecurity( PSECURITY_DESCRIPTOR ParentDescriptor, PSECURITY_DESCRIPTOR CreatorDescriptor, diff --git a/dlls/advapi32/tests/cred.c b/dlls/advapi32/tests/cred.c index 6d7b758c195..1bb2545e47b 100644 --- a/dlls/advapi32/tests/cred.c +++ b/dlls/advapi32/tests/cred.c @@ -97,8 +97,12 @@ static void test_CredWriteA(void) SetLastError(0xdeadbeef); ret = pCredWriteA(&new_cred, 0); - ok(!ret && ( GetLastError() == ERROR_BAD_USERNAME || GetLastError() == ERROR_NO_SUCH_LOGON_SESSION /* Vista */ ), - "CredWrite with username without domain should return ERROR_BAD_USERNAME or ERROR_NO_SUCH_LOGON_SESSION not %d\n", GetLastError()); + ok(!ret, "CredWrite with username without domain should have failed\n"); + ok(GetLastError() == ERROR_BAD_USERNAME || + GetLastError() == ERROR_NO_SUCH_LOGON_SESSION || /* Vista */ + broken(GetLastError() == ERROR_IO_PENDING), + "CredWrite with username without domain should return ERROR_BAD_USERNAME" + "or ERROR_NO_SUCH_LOGON_SESSION not %d\n", GetLastError()); new_cred.UserName = NULL; SetLastError(0xdeadbeef); @@ -175,10 +179,12 @@ static void test_generic(void) { if (!strcmp(creds[i]->TargetName, TEST_TARGET_NAME)) { - ok(creds[i]->Type == CRED_TYPE_GENERIC, "expected creds[%d]->Type CRED_TYPE_GENERIC but got %d\n", i, creds[i]->Type); + ok(creds[i]->Type == CRED_TYPE_GENERIC || + creds[i]->Type == CRED_TYPE_DOMAIN_PASSWORD, /* Vista */ + "expected creds[%d]->Type CRED_TYPE_GENERIC or CRED_TYPE_DOMAIN_PASSWORD but got %d\n", i, creds[i]->Type); ok(!creds[i]->Flags, "expected creds[%d]->Flags 0 but got 0x%x\n", i, creds[i]->Flags); ok(!strcmp(creds[i]->Comment, "Comment"), "expected creds[%d]->Comment \"Comment\" but got \"%s\"\n", i, creds[i]->Comment); - check_blob(__LINE__, CRED_TYPE_GENERIC, creds[i]); + check_blob(__LINE__, creds[i]->Type, creds[i]); ok(creds[i]->Persist, "expected creds[%d]->Persist CRED_PERSIST_ENTERPRISE but got %d\n", i, creds[i]->Persist); ok(!strcmp(creds[i]->UserName, "winetest"), "expected creds[%d]->UserName \"winetest\" but got \"%s\"\n", i, creds[i]->UserName); found = TRUE; @@ -216,6 +222,12 @@ static void test_domain_password(DWORD cred_type) new_cred.TargetAlias = NULL; new_cred.UserName = (char *)"test\\winetest"; ret = pCredWriteA(&new_cred, 0); + if (!ret && GetLastError() == ERROR_NO_SUCH_LOGON_SESSION) + { + skip("CRED_TYPE_DOMAIN_PASSWORD credentials are not supported " + "or are disabled. Skipping\n"); + return; + } ok(ret, "CredWriteA failed with error %d\n", GetLastError()); ret = pCredEnumerateA(NULL, 0, &count, &creds); diff --git a/dlls/advapi32/tests/crypt_lmhash.c b/dlls/advapi32/tests/crypt_lmhash.c index b90e02ccd15..9f2b24e694f 100644 --- a/dlls/advapi32/tests/crypt_lmhash.c +++ b/dlls/advapi32/tests/crypt_lmhash.c @@ -348,18 +348,20 @@ static void test_SystemFunction005(void) out.Length = 0; out.MaximumLength = 0; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_SUCCESS, "function failed\n"); + ok(r == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", r); ok(res.Length == in.Length, "Length wrong\n"); ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n"); res.MaximumLength = 0; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_BUFFER_TOO_SMALL, "function failed\n"); + ok(r == STATUS_BUFFER_TOO_SMALL, + "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", r); key.Length = 1; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_UNKNOWN_REVISION, "function failed\n"); + ok(r == STATUS_UNKNOWN_REVISION, + "Expected STATUS_UNKNOWN_REVISION, got %08x\n", r); key.Length = 0; r = pSystemFunction005(&out, &key, &res); diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 9b3f7e68e25..978cc469071 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1705,8 +1705,10 @@ static void test_security_descriptor(void) } } -#define TEST_GRANTED_ACCESS(a,b) test_granted_access(a,b,__LINE__) -static void test_granted_access(HANDLE handle, ACCESS_MASK access, int line) +#define TEST_GRANTED_ACCESS(a,b) test_granted_access(a,b,0,__LINE__) +#define TEST_GRANTED_ACCESS2(a,b,c) test_granted_access(a,b,c,__LINE__) +static void test_granted_access(HANDLE handle, ACCESS_MASK access, + ACCESS_MASK alt, int line) { OBJECT_BASIC_INFORMATION obj_info; NTSTATUS status; @@ -1720,8 +1722,13 @@ static void test_granted_access(HANDLE handle, ACCESS_MASK access, int line) status = pNtQueryObject( handle, ObjectBasicInformation, &obj_info, sizeof(obj_info), NULL ); ok_(__FILE__, line)(!status, "NtQueryObject with err: %08x\n", status); - ok_(__FILE__, line)(obj_info.GrantedAccess == access, "Granted access should " - "be 0x%08x, instead of 0x%08x\n", access, obj_info.GrantedAccess); + if (alt) + ok_(__FILE__, line)(obj_info.GrantedAccess == access || + obj_info.GrantedAccess == alt, "Granted access should be 0x%08x " + "or 0x%08x, instead of 0x%08x\n", access, alt, obj_info.GrantedAccess); + else + ok_(__FILE__, line)(obj_info.GrantedAccess == access, "Granted access should " + "be 0x%08x, instead of 0x%08x\n", access, obj_info.GrantedAccess); } #define CHECK_SET_SECURITY(o,i,e) \ @@ -1833,7 +1840,8 @@ static void test_process_security(void) /* Doesn't matter what ACL say we should get full access for ourselves */ ok(CreateProcessA( NULL, buffer, &psa, NULL, FALSE, 0, NULL, NULL, &startup, &info ), "CreateProcess with err:%d\n", GetLastError()); - TEST_GRANTED_ACCESS( info.hProcess, PROCESS_ALL_ACCESS ); + TEST_GRANTED_ACCESS2( info.hProcess, PROCESS_ALL_ACCESS, + STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL ); winetest_wait_child_process( info.hProcess ); CloseHandle( info.hProcess ); @@ -1882,7 +1890,8 @@ static void test_process_security_child(void) ok(DuplicateHandle( GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &handle, 0, TRUE, DUPLICATE_SAME_ACCESS ), "duplicating handle err:%d\n", GetLastError()); - TEST_GRANTED_ACCESS( handle, PROCESS_ALL_ACCESS ); + TEST_GRANTED_ACCESS2( handle, PROCESS_ALL_ACCESS, + STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL ); CloseHandle( handle ); @@ -1890,7 +1899,8 @@ static void test_process_security_child(void) ok(DuplicateHandle( GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &handle, PROCESS_ALL_ACCESS, TRUE, 0 ), "duplicating handle err:%d\n", GetLastError()); - TEST_GRANTED_ACCESS( handle, PROCESS_ALL_ACCESS ); + TEST_GRANTED_ACCESS2( handle, PROCESS_ALL_ACCESS, + STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL ); ok(DuplicateHandle( GetCurrentProcess(), handle, GetCurrentProcess(), &handle1, PROCESS_VM_READ, TRUE, 0 ), "duplicating handle err:%d\n", GetLastError()); diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c index 1cf0f62fffe..268827e043c 100644 --- a/dlls/advapi32/tests/service.c +++ b/dlls/advapi32/tests/service.c @@ -960,8 +960,7 @@ static void test_enum_svc(void) BOOL ret; DWORD bufsize, needed, returned, resume; DWORD tempneeded, tempreturned; - DWORD drivercountactive, servicecountactive; - DWORD drivercountinactive, servicecountinactive; + DWORD servicecountactive, servicecountinactive; ENUM_SERVICE_STATUS *services; ENUM_SERVICE_STATUS_PROCESS *exservices; INT i; @@ -1172,39 +1171,15 @@ static void test_enum_svc(void) /* See if things add up */ - /* Get the number of active driver services */ - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_ACTIVE, NULL, 0, - &needed, &returned, NULL); - services = HeapAlloc(GetProcessHeap(), 0, needed); - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_ACTIVE, services, - needed, &needed, &returned, NULL); - HeapFree(GetProcessHeap(), 0, services); - - /* Store the number of active driver services */ - drivercountactive = returned; - - /* Get the number of inactive driver services */ - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_INACTIVE, NULL, 0, - &needed, &returned, NULL); - services = HeapAlloc(GetProcessHeap(), 0, needed); - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_INACTIVE, services, - needed, &needed, &returned, NULL); - HeapFree(GetProcessHeap(), 0, services); - - drivercountinactive = returned; - - /* Get the number of driver services */ - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_STATE_ALL, NULL, 0, - &needed, &returned, NULL); - services = HeapAlloc(GetProcessHeap(), 0, needed); - EnumServicesStatusA(scm_handle, SERVICE_DRIVER, SERVICE_STATE_ALL, services, - needed, &needed, &returned, NULL); - HeapFree(GetProcessHeap(), 0, services); - - /* Check if total is the same as active and inactive driver services */ - todo_wine - ok(returned == (drivercountactive + drivercountinactive), - "Something wrong in the calculation\n"); + /* Vista only shows the drivers with a state of SERVICE_RUNNING as active + * and doesn't count the others as inactive. This means that Vista could + * show a total that is greater then the sum of active and inactive drivers. + * + * The number of active and inactive drivers is greatly influenced by the + * time when tests are run, immediately after boot or later for example. + * + * Both reasons make calculations for drivers not so useful + */ /* Get the number of active win32 services */ EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0, @@ -1239,7 +1214,8 @@ static void test_enum_svc(void) ok(returned == (servicecountactive + servicecountinactive), "Something wrong in the calculation\n"); - /* Get the number of all services. + /* Get all drivers and services + * * Fetch the status of the last call as failing could make the following tests crash * on Wine (we don't return anything yet). */ @@ -1249,12 +1225,7 @@ static void test_enum_svc(void) ret = EnumServicesStatusA(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL, services, needed, &needed, &returned, NULL); - /* Check if total is the same as all those single calls */ - todo_wine - ok(returned == (drivercountactive + drivercountinactive + servicecountactive + servicecountinactive), - "Something wrong in the calculation\n"); - - /* Loop through all those returned services */ + /* Loop through all those returned drivers and services */ for (i = 0; ret && i < returned; i++) { SERVICE_STATUS status = services[i].ServiceStatus; @@ -1266,15 +1237,6 @@ static void test_enum_svc(void) /* Decrement the counters to see if the functions calls return the same * numbers as the contents of these structures. */ - if (status.dwServiceType & (SERVICE_FILE_SYSTEM_DRIVER | SERVICE_KERNEL_DRIVER)) - { - /* FIXME: should be probably more then just SERVICE_RUNNING */ - if (status.dwCurrentState == SERVICE_RUNNING) - drivercountactive--; - else - drivercountinactive--; - } - if (status.dwServiceType & (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS)) { if (status.dwCurrentState == SERVICE_RUNNING) @@ -1287,8 +1249,6 @@ static void test_enum_svc(void) todo_wine { - ok(drivercountactive == 0, "Active driver mismatch\n"); - ok(drivercountinactive == 0, "Inactive driver mismatch\n"); ok(servicecountactive == 0, "Active services mismatch\n"); ok(servicecountinactive == 0, "Inactive services mismatch\n"); } @@ -1561,39 +1521,6 @@ static void test_enum_svc(void) /* See if things add up */ - /* Get the number of active driver services */ - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_ACTIVE, - NULL, 0, &needed, &returned, NULL, NULL); - exservices = HeapAlloc(GetProcessHeap(), 0, needed); - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_ACTIVE, - (BYTE*)exservices, needed, &needed, &returned, NULL, NULL); - HeapFree(GetProcessHeap(), 0, exservices); - - /* Store the number of active driver services */ - drivercountactive = returned; - - /* Get the number of inactive driver services */ - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_INACTIVE, - NULL, 0, &needed, &returned, NULL, NULL); - exservices = HeapAlloc(GetProcessHeap(), 0, needed); - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_INACTIVE, - (BYTE*)exservices, needed, &needed, &returned, NULL, NULL); - HeapFree(GetProcessHeap(), 0, exservices); - - drivercountinactive = returned; - - /* Get the number of driver services */ - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_STATE_ALL, - NULL, 0, &needed, &returned, NULL, NULL); - exservices = HeapAlloc(GetProcessHeap(), 0, needed); - pEnumServicesStatusExA(scm_handle, 0, SERVICE_DRIVER, SERVICE_STATE_ALL, - (BYTE*)exservices, needed, &needed, &returned, NULL, NULL); - HeapFree(GetProcessHeap(), 0, exservices); - - /* Check if total is the same as active and inactive driver services */ - ok(returned == (drivercountactive + drivercountinactive), - "Something wrong in the calculation\n"); - /* Get the number of active win32 services */ pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0, &needed, &returned, NULL, NULL); @@ -1626,18 +1553,14 @@ static void test_enum_svc(void) ok(returned == (servicecountactive + servicecountinactive), "Something wrong in the calculation\n"); - /* Get the number of all services */ + /* Get all drivers and services */ pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER, SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL, NULL); exservices = HeapAlloc(GetProcessHeap(), 0, needed); pEnumServicesStatusExA(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER, SERVICE_STATE_ALL, (BYTE*)exservices, needed, &needed, &returned, NULL, NULL); - /* Check if total is the same as all those single calls */ - ok(returned == (drivercountactive + drivercountinactive + servicecountactive + servicecountinactive), - "Something wrong in the calculation\n"); - - /* Loop through all those returned services */ + /* Loop through all those returned drivers and services */ for (i = 0; i < returned; i++) { SERVICE_STATUS_PROCESS status = exservices[i].ServiceStatusProcess; @@ -1653,11 +1576,6 @@ static void test_enum_svc(void) */ if (status.dwServiceType & (SERVICE_FILE_SYSTEM_DRIVER | SERVICE_KERNEL_DRIVER)) { - if (status.dwCurrentState == SERVICE_RUNNING) - drivercountactive--; - else - drivercountinactive--; - /* We shouldn't have a process id for drivers */ ok(status.dwProcessId == 0, "This driver shouldn't have an associated process id\n"); @@ -1684,8 +1602,6 @@ static void test_enum_svc(void) } HeapFree(GetProcessHeap(), 0, exservices); - ok(drivercountactive == 0, "Active driver mismatch\n"); - ok(drivercountinactive == 0, "Inactive driver mismatch\n"); ok(servicecountactive == 0, "Active services mismatch\n"); ok(servicecountinactive == 0, "Inactive services mismatch\n"); diff --git a/dlls/comctl32/comctl_Cn.rc b/dlls/comctl32/comctl_Zh.rc similarity index 62% rename from dlls/comctl32/comctl_Cn.rc rename to dlls/comctl32/comctl_Zh.rc index ed5e616d783..a7a58eee414 100644 --- a/dlls/comctl32/comctl_Cn.rc +++ b/dlls/comctl32/comctl_Zh.rc @@ -16,32 +16,34 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#pragma code_page(936) IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140 STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE -CAPTION "ÊôÐÔ %s" +CAPTION "属性 %s" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "È·¶¨", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP - PUSHBUTTON "È¡Ïû", IDCANCEL,58,122,50,14 - PUSHBUTTON "Ó¦ÓÃ(&A)", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED - PUSHBUTTON "°ïÖú", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP + DEFPUSHBUTTON "确定", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP + PUSHBUTTON "取消", IDCANCEL,58,122,50,14 + PUSHBUTTON "应用(&A)", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED + PUSHBUTTON "帮助", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114 END IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE -CAPTION "Ïòµ¼" +CAPTION "向导" FONT 8, "MS Shell Dlg" BEGIN - PUSHBUTTON "< ÉÏÒ»²½(&B)", IDC_BACK_BUTTON,71,138,50,14 - DEFPUSHBUTTON "ÏÂÒ»²½(&N) >", IDC_NEXT_BUTTON,121,138,50,14 - DEFPUSHBUTTON "½áÊø", IDC_FINISH_BUTTON,121,138,50,14 - PUSHBUTTON "È¡Ïû", IDCANCEL,178,138,50,14 - PUSHBUTTON "°ïÖú", IDHELP,235,138,50,14,WS_GROUP + PUSHBUTTON "< 上一步(&B)", IDC_BACK_BUTTON,71,138,50,14 + DEFPUSHBUTTON "下一步(&N) >", IDC_NEXT_BUTTON,121,138,50,14 + DEFPUSHBUTTON "结束", IDC_FINISH_BUTTON,121,138,50,14 + PUSHBUTTON "取消", IDCANCEL,178,138,50,14 + PUSHBUTTON "帮助", IDHELP,235,138,50,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE @@ -50,41 +52,41 @@ END IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "×Ô¶¨Ò幤¾ßÀ¸" +CAPTION "自定义工具栏" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "¹Ø±Õ(&C)", IDCANCEL,308,6,44,14 - PUSHBUTTON "ÖØÖÃ(&e)", IDC_RESET_BTN,308,23,44,14 - PUSHBUTTON "°ïÖú(&H)", IDC_HELP_BTN,308,40,44,14 - PUSHBUTTON "ÉÏÒÆ(&U)", IDC_MOVEUP_BTN,308,74,44,14 - PUSHBUTTON "ÏÂÒÆ(&D)", IDC_MOVEDN_BTN,308,91,44,14 - LTEXT "¿ÉÓù¤¾ßÀ¸°´Å¥(&V):", -1,4,5,84,10 + DEFPUSHBUTTON "关闭(&C)", IDCANCEL,308,6,44,14 + PUSHBUTTON "重置(&e)", IDC_RESET_BTN,308,23,44,14 + PUSHBUTTON "帮助(&H)", IDC_HELP_BTN,308,40,44,14 + PUSHBUTTON "上移(&U)", IDC_MOVEUP_BTN,308,74,44,14 + PUSHBUTTON "下移(&D)", IDC_MOVEDN_BTN,308,91,44,14 + LTEXT "可用工具栏按钮(&V):", -1,4,5,84,10 LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - PUSHBUTTON "Ìí¼Ó(&A) ->", IDOK, 131, 42, 44, 14 - PUSHBUTTON "<- ɾ³ý(&R)", IDC_REMOVE_BTN,131,62,44,14 - LTEXT "µ±Ç°¹¤¾ßÀ¸°´Å¥(&T):", -1,182,5,78,10 + PUSHBUTTON "添加(&A) ->", IDOK, 131, 42, 44, 14 + PUSHBUTTON "<- 删除(&R)", IDC_REMOVE_BTN,131,62,44,14 + LTEXT "当前工具栏按钮(&T):", -1,182,5,78,10 LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP END STRINGTABLE DISCARDABLE { - IDS_CLOSE "¹Ø±Õ" + IDS_CLOSE "关闭" } STRINGTABLE DISCARDABLE { - IDM_TODAY "½ñÌì:" - IDM_GOTODAY "תµ½½ñÌì" + IDM_TODAY "今天:" + IDM_GOTODAY "转到今天" } STRINGTABLE DISCARDABLE { - IDS_SEPARATOR "·Ö¸ô·û" + IDS_SEPARATOR "分隔符" } STRINGTABLE DISCARDABLE { - HKY_NONE "ÎÞ" + HKY_NONE "无" } #pragma code_page(default) diff --git a/dlls/comctl32/rsrc.rc b/dlls/comctl32/rsrc.rc index 772248a4531..c3bf74a4df3 100644 --- a/dlls/comctl32/rsrc.rc +++ b/dlls/comctl32/rsrc.rc @@ -91,7 +91,6 @@ IDI_TT_ERROR_SM ICON LOADONCALL DISCARDABLE idi_tt_error_sm.ico */ #include "comctl_Bg.rc" -#include "comctl_Cn.rc" #include "comctl_Cs.rc" #include "comctl_De.rc" #include "comctl_El.rc" @@ -114,3 +113,4 @@ IDI_TT_ERROR_SM ICON LOADONCALL DISCARDABLE idi_tt_error_sm.ico #include "comctl_Th.rc" #include "comctl_Tr.rc" #include "comctl_Uk.rc" +#include "comctl_Zh.rc" diff --git a/dlls/comctl32/tests/comboex.c b/dlls/comctl32/tests/comboex.c index 321b2a78b9f..d0e0bb62547 100644 --- a/dlls/comctl32/tests/comboex.c +++ b/dlls/comctl32/tests/comboex.c @@ -228,7 +228,8 @@ static void test_WM_LBUTTONDOWN(void) result = SendMessage(hCombo, WM_LBUTTONDOWN, 0, MAKELPARAM(x, y)); ok(result, "WM_LBUTTONDOWN was not processed. LastError=%d\n", GetLastError()); - ok(GetFocus() == hCombo, + ok(GetFocus() == hCombo || + broken(GetFocus() != hCombo), /* win98 */ "Focus not on ComboBoxEx's ComboBox Control, instead on %p\n", GetFocus()); ok(SendMessage(hComboEx, CB_GETDROPPEDSTATE, 0, 0), @@ -239,7 +240,8 @@ static void test_WM_LBUTTONDOWN(void) result = SendMessage(hCombo, WM_LBUTTONUP, 0, MAKELPARAM(x, y)); ok(result, "WM_LBUTTONUP was not processed. LastError=%d\n", GetLastError()); - ok(GetFocus() == hCombo, + ok(GetFocus() == hCombo || + broken(GetFocus() != hCombo), /* win98 */ "Focus not on ComboBoxEx's ComboBox Control, instead on %p\n", GetFocus()); @@ -251,14 +253,16 @@ static void test_WM_LBUTTONDOWN(void) result = SendMessage(hList, WM_MOUSEMOVE, 0, MAKELPARAM(x, y)); ok(!result, "WM_MOUSEMOVE was not processed. LastError=%d\n", GetLastError()); - ok(GetFocus() == hCombo, + ok(GetFocus() == hCombo || + broken(GetFocus() != hCombo), /* win98 */ "Focus not on ComboBoxEx's ComboBox Control, instead on %p\n", GetFocus()); result = SendMessage(hList, WM_LBUTTONDOWN, 0, MAKELPARAM(x, y)); ok(!result, "WM_LBUTTONDOWN was not processed. LastError=%d\n", GetLastError()); - ok(GetFocus() == hCombo, + ok(GetFocus() == hCombo || + broken(GetFocus() != hCombo), /* win98 */ "Focus not on ComboBoxEx's ComboBox Control, instead on %p\n", GetFocus()); ok(SendMessage(hComboEx, CB_GETDROPPEDSTATE, 0, 0), @@ -270,10 +274,15 @@ static void test_WM_LBUTTONDOWN(void) todo_wine ok(GetFocus() == hEdit, "Focus not on ComboBoxEx's Edit Control, instead on %p\n", GetFocus()); - ok(!SendMessage(hCombo, CB_GETDROPPEDSTATE, 0, 0), + + result = SendMessage(hCombo, CB_GETDROPPEDSTATE, 0, 0); + ok(!result || + broken(result != 0), /* win98 */ "The dropdown list should have been rolled up.\n"); idx = SendMessage(hComboEx, CB_GETCURSEL, 0, 0); - ok(idx == 4, "Current Selection: expected %d, got %d\n", 4, idx); + ok(idx == 4 || + broken(idx == -1), /* win98 */ + "Current Selection: expected %d, got %d\n", 4, idx); DestroyWindow(hComboEx); } diff --git a/dlls/comctl32/tests/dpa.c b/dlls/comctl32/tests/dpa.c index 552387f6fce..ae7fcb3897f 100644 --- a/dlls/comctl32/tests/dpa.c +++ b/dlls/comctl32/tests/dpa.c @@ -363,7 +363,9 @@ static void test_dpa(void) rc=CheckDPA(dpa, 0x123456, &dw); ok(rc, "dw=0x%x\n", dw); rc=CheckDPA(dpa2, 0x123456, &dw2); - ok(rc, "dw2=0x%x\n", dw2); + ok(rc || + broken(!rc), /* win98 */ + "dw2=0x%x\n", dw2); rc=CheckDPA(dpa3, 0x123456, &dw3); ok(rc, "dw3=0x%x\n", dw3); } diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c index 4f8b32d84f1..2e00e6752e5 100644 --- a/dlls/comctl32/tests/listview.c +++ b/dlls/comctl32/tests/listview.c @@ -48,7 +48,10 @@ static const struct message create_parent_wnd_seq[] = { { WM_CREATE, sent }, { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_QUERYNEWPALETTE, sent|optional }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGED, sent|optional }, + { WM_NCCALCSIZE, sent|wparam|optional, 1 }, { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, { WM_ACTIVATE, sent|wparam, 1 }, @@ -872,7 +875,9 @@ static void test_icon_spacing(void) trace("test icon spacing\n"); r = SendMessage(hwnd, LVM_SETICONSPACING, 0, (LPARAM) MAKELONG(20, 30)); - expect(MAKELONG(w,h), r); + ok(r == MAKELONG(w, h) || + broken(r == MAKELONG(w, w)), /* win98 */ + "Expected %d, got %d\n", MAKELONG(w, h), r); r = SendMessage(hwnd, LVM_SETICONSPACING, 0, (LPARAM) MAKELONG(25, 35)); expect(MAKELONG(20,30), r); diff --git a/dlls/comctl32/tests/tooltips.c b/dlls/comctl32/tests/tooltips.c index c945a27f5db..6bf5a3a0220 100644 --- a/dlls/comctl32/tests/tooltips.c +++ b/dlls/comctl32/tests/tooltips.c @@ -266,9 +266,16 @@ static void test_gettext(void) DestroyWindow(hwnd); + SetLastError(0xdeadbeef); hwnd = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL, 0, 10, 10, 300, 100, NULL, NULL, NULL, 0); + + if (!hwnd && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("CreateWindowExW is not implemented\n"); + return; + } + assert(hwnd); toolinfoW.cbSize = sizeof(TTTOOLINFOW); diff --git a/dlls/comctl32/tests/trackbar.c b/dlls/comctl32/tests/trackbar.c index 41f866ec3fc..7acecfe3868 100644 --- a/dlls/comctl32/tests/trackbar.c +++ b/dlls/comctl32/tests/trackbar.c @@ -401,6 +401,8 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP message != WM_GETICON && message != WM_DEVICECHANGE) { + trace("parent: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; @@ -450,6 +452,8 @@ static LRESULT WINAPI trackbar_subclass_proc(HWND hwnd, UINT message, WPARAM wPa LRESULT ret; struct message msg; + trace("trackbar: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c index 6f8e395f26d..c24ff1e13c0 100644 --- a/dlls/comctl32/tests/updown.c +++ b/dlls/comctl32/tests/updown.c @@ -70,6 +70,7 @@ static const struct message create_parent_wnd_seq[] = { { WM_CREATE, sent }, { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_QUERYNEWPALETTE, sent|optional }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, diff --git a/dlls/comdlg32/cdlg_Cn.rc b/dlls/comdlg32/cdlg_Cn.rc deleted file mode 100644 index f6f067ddbe9..00000000000 --- a/dlls/comdlg32/cdlg_Cn.rc +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright 2002 Tisheng Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -/* - * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. - */ - -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED - -OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "´ò¿ª" -FONT 8, "MS Shell Dlg" -{ - LTEXT "ÎļþÃû(&N):", 1090, 6, 6, 76, 9 - EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP - LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "Îļþ¼Ð(&D):", -1, 110, 6, 92, 9 - LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP - LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "ÎļþÀàÐÍ(&T):", 1089, 6, 104, 90, 9 - COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "Çý¶¯Æ÷(&v):", 1091, 110, 104, 92, 9 - COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "´ò¿ª", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú(&H)", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "Ö»¶Á(&R)", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP -} - - -SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Áí´æΪ..." -FONT 8, "MS Shell Dlg" -{ - LTEXT "ÎļþÃû(&N):", 1090, 6, 6, 76, 9 - EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP - LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "Ŀ¼(&D):", -1, 110, 6, 92, 9 - LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP - LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "ÎļþÀàÐÍ(&T):", 1089, 6, 104, 90, 9 - COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "Çý¶¯Æ÷(&v):", 1091, 110, 104, 92, 9 - COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "±£´æ", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú(&H)", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "Ö»¶Á(&R)", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP -} - - -PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "´òÓ¡" -FONT 8, "MS Shell Dlg" -{ - LTEXT "´òÓ¡»ú:", 1088, 6, 6, 40, 9 - LTEXT "", 1089, 60, 6, 150, 9 - GROUPBOX "´òÓ¡·¶Î§", grp1, 6, 30, 160, 65, BS_GROUPBOX - RADIOBUTTON "È«²¿(&A)", rad1, 16, 45, 60, 12 - RADIOBUTTON "Ñ¡ÔñµÄ·¶Î§(&e)", rad2, 16, 60, 60, 12 - RADIOBUTTON "Ò³Êý(&G)", rad3, 16, 75, 60, 12 - DEFPUSHBUTTON "È·¶¨", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÉèÖÃ(&S)", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - LTEXT "´Ó(&F):", 1090, 60, 80, 30, 9 - LTEXT "µ½(&T):", 1091, 120, 80, 30, 9 - LTEXT "´òÓ¡ÖÊÁ¿(&Q):", 1092, 6, 100, 76, 9 - COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - CHECKBOX "´òÓ¡µ½Îļþ(&l):", chx1, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "ѹС", chx2, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP -} - - -PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "´òÓ¡ÉèÖÃ" -FONT 8, "MS Shell Dlg" -{ - GROUPBOX "´òÓ¡»ú", grp1, 6, 10, 180, 65, BS_GROUPBOX - RADIOBUTTON "ĬÈÏ´òÓ¡»ú(&D)", rad1, 16, 20, 80, 12 - LTEXT "[ÎÞ]", 1088, 35, 35, 120, 9 - RADIOBUTTON "Ö¸¶¨µÄ´òÓ¡»ú(&P)", rad2, 16, 50, 80, 12 - COMBOBOX cmb1, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "È·¶¨", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÉèÖÃ(&S)", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - GROUPBOX "·½Ïò(&O)", grp2, 6, 85, 100, 50, BS_GROUPBOX - RADIOBUTTON "×ÝÏò(&P)", rad3, 50, 100, 40, 12 - RADIOBUTTON "ºáÏò(&L)", rad4, 50, 115, 40, 12 - ICON "LANDSCAP", stc10, 10, 95, 32, 32 - ICON "PORTRAIT", stc11, 10, 95, 32, 32 - GROUPBOX "Ö½ÕÅ", grp3, 120, 85, 180, 50, BS_GROUPBOX - LTEXT "Ö½ÕÅ´óС(&Z)", 1089, 130, 95, 30, 9 - LTEXT "Ö½ÕÅÀ´Ô´(&S)", 1090, 130, 110, 30, 9 - COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP -} - - -CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "×ÖÌå" -FONT 8, "MS Shell Dlg" -{ - LTEXT "×ÖÌå(&F):",1088 ,6,3,40,9 - COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | - CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "×ÖÌåÑùʽ(&y):",1089 ,108,3,44,9 - COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | - WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "´óС(&S):",1090,179,3,30,9 - COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | - WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT - DEFPUSHBUTTON "È·¶¨",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡Ïû",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "Ó¦ÓÃ(&A)", psh3,218,40,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú(&H)" , pshHelp,218,57,40,14,WS_GROUP | WS_TABSTOP - GROUPBOX "Ч¹û",1072,6,72,84,34,WS_GROUP - CHECKBOX "ɾ³ýÏß(&k)", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "Ï»®Ïß(&U)", chx2, 10,94,50,10, BS_AUTOCHECKBOX - LTEXT "ÑÕÉ«(&C):", 1091 ,6,110,30,9 - COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | - CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - GROUPBOX "ʾÀý",grp2,98,72,120,36,WS_GROUP - CTEXT "ÖÐÎÄ×ÖÌåAaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE - LTEXT "ÓïÑÔ(&i):",stc7,98,114,80,9 - COMBOBOX cmb5,98,124,120,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | - CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP -} - - -CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÑÕÉ«" -FONT 8, "MS Shell Dlg" -{ - LTEXT "»ù±¾ÑÕÉ«(&B):", 1088, 4, 4, 140, 10 - LTEXT "×Ô¶¨ÖÆÑÕÉ«(&C):", 1089, 4, 106, 140, 10 - LTEXT "ÑÕÉ«|´¿É«(&O)", 1090, 150, 151, 48, 10 - LTEXT "ºì(&R):", 726 /*1094*/,249,126,24,10 - EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "ÂÌ(&G):",727/*1095*/,249,140,24,10 - EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "À¶(&B):",728 /*1096*/,249,154,24,10 - EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "É«µ÷(&E):" ,723 /*1091*/,202,126,22,10 - EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "±¥ºÍ¶È(&S):" ,724 /*1092*/,202,140,22,10 - EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "ÁÁ¶È(&L)" ,725 /*1093*/,202,154,22,10 - EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 - CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 - CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 - CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 - CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 - DEFPUSHBUTTON "È·¶¨", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú", pshHelp,100,166, 44, 14 - PUSHBUTTON "Ìí¼Óµ½×Ô¶¨ÖÆÑÕÉ«(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "¹æ¶¨×Ô¶¨ÒåÑÕÉ«(&D)>>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ -} - - -FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "²éÕÒ" -FONT 8, "MS Shell Dlg" -{ - LTEXT "²éÕÒ(&n):", -1, 4, 8, 42, 8 - EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "È«×ÖÆ¥Åä(&W)", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Çø·Ö´óСд(&C)", chx2, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP - GROUPBOX "·½Ïò", grp1, 107, 26, 68, 28 - CONTROL "ÏòÉÏ(&U)", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 - CONTROL "ÏòÏÂ(&D)", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 - - DEFPUSHBUTTON "²éÕÒÏÂÒ»¸ö(&F)", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡Ïû", IDCANCEL , 182, 23, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú(&H)", pshHelp , 182, 45, 50, 14, WS_GROUP | WS_TABSTOP -} - - -REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ìæ»»" -FONT 8, "MS Shell Dlg" -{ - LTEXT "²éÕÒÄÚÈÝ(&n):", -1, 4, 9, 48, 8 - EDITTEXT edt1, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "Ì滻Ϊ(&p):", -1, 4, 26, 48, 8 - EDITTEXT edt2, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "È«×ÖÆ¥Åä(&W)", chx1, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "Çø·Ö´óСд(&C)", chx2, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP - - DEFPUSHBUTTON "²éÕÒÏÂÒ»¸ö(&F)", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "Ìæ»»(&R)", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "È«²¿Ìæ»»(&A)", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "°ïÖú(&H)", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP -} - - -PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | - DS_CONTEXTHELP | DS_3DLOOK -CAPTION "´òÓ¡" -FONT 8, "MS Shell Dlg" -{ - DEFPUSHBUTTON "È·¶¨", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡Ïû", IDCANCEL, 232,164, 48,14, WS_GROUP - PUSHBUTTON "°ïÖú(&H)", pshHelp, 50, 161, 48,14, WS_GROUP - - GROUPBOX "´òÓ¡»ú", grp4, 8, 4, 272,84, WS_GROUP - CONTROL "´òÓ¡µ½Îļþ(&l)", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 - PUSHBUTTON "ÊôÐÔ(&P)", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "Ãû³Æ(&N):", stc6, 16, 20, 36,8 - COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "״̬:", stc8, 16, 36, 36,10, SS_NOPREFIX - LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "ÐͺÅ:", stc7, 16, 48, 36,10, SS_NOPREFIX - LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "λÖÃ:", stc10, 16, 60, 36,10, SS_NOPREFIX - LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "±¸×¢:", stc9, 16, 72, 36,10, SS_NOPREFIX - LTEXT "Dummy Remark", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - - GROUPBOX "·ÝÊý", grp2, 160, 92, 120,64, WS_GROUP - LTEXT "·ÝÊý(&C):",stc5,168,108,68,8 - ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE - CONTROL "×Ô¶¯·ÖÒ³(&o)", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 - EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER - - GROUPBOX "´òÓ¡·¶Î§", grp1, 8,92, 144,64, WS_GROUP - CONTROL "È«²¿(&A)", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 - CONTROL "Ò³Êý(&G)", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 - CONTROL "Ñ¡ÔñµÄ·¶Î§(&S)", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 - EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER - EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER - RTEXT "´Ó(&f):", stc2, 52,124, 20,8 - RTEXT "µ½(&t):", stc3, 100,124, 16,8 -} - -PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | - DS_CONTEXTHELP | DS_3DLOOK -CAPTION "´òÓ¡ÉèÖÃ" -FONT 8, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "È·¶¨",IDOK,180,156,48,14,WS_GROUP - PUSHBUTTON "È¡Ïû",IDCANCEL,232,156,48,14 -/* PUSHBUTTON "Network...", psh5, 284,156,48,14 */ - - GROUPBOX "´òÓ¡»ú", grp4, 8, 4, 272,84, WS_GROUP - PUSHBUTTON "ÊôÐÔ(&P)", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "Ãû³Æ(&N):", stc6, 16, 20, 36,8 - COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "״̬:", stc8, 16, 36, 36,10, SS_NOPREFIX - LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "ÐͺÅ:", stc7, 16, 48, 36,10, SS_NOPREFIX - LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "λÖÃ:", stc10, 16, 60, 36,10, SS_NOPREFIX - LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "±¸×¢:", stc9, 16, 72, 36,10, SS_NOPREFIX - LTEXT "Dummy Remark", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - - GROUPBOX "Ö½ÕÅ", grp2, 8, 92, 164,56, WS_GROUP - LTEXT "Ö½ÕÅ´óС(&z):", stc2, 16,108, 36, 8 - COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "Ö½ÕÅÀ´Ô´(&S):", stc3, 16,128, 36, 8 - COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - - GROUPBOX "·½Ïò", grp1, 180, 92, 100,56, WS_GROUP - ICON "", ico1, 195,112, 18,20, WS_GROUP - CONTROL "×ÝÏò(&P)", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 - CONTROL "ºáÏò(&L)", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 -END - -PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Ò³ÃæÉèÖÃ" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "", rct1, "Static", SS_WHITERECT, 80, 8, 80, 80 - CONTROL "", rct2, "Static", SS_GRAYRECT, 160, 12, 4, 80 - CONTROL "", rct3, "Static", SS_GRAYRECT, 84, 88, 80, 4 - GROUPBOX "Ö½ÕÅ", grp2, 8, 96, 224, 56, BS_GROUPBOX - LTEXT "´óС(&S):", stc2, 16, 112, 36, 8 - COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL - LTEXT "À´Ô´(&S):", stc3, 16, 132, 36, 8 - COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL - GROUPBOX "·½Ïò(&O)", grp1, 8, 156, 64, 56, BS_GROUPBOX - AUTORADIOBUTTON "×ÝÏò(&P)", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON - AUTORADIOBUTTON "ºáÏò(&L)", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON - GROUPBOX "±ß¾à", grp4, 80, 156, 152, 56, BS_GROUPBOX - LTEXT "×ó(&e):", stc15, 88, 172, 21, 8 - EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER - LTEXT "ÓÒ(&R):", stc16, 159, 172, 27, 8 - EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER - LTEXT "ÉÏ(&o):", stc17, 88, 192, 21, 8 - EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER - LTEXT "ÏÂ(&B):", stc18, 159, 192, 23, 8 - EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER - DEFPUSHBUTTON "È·¶¨", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON - PUSHBUTTON "È¡Ïû", IDCANCEL, 126, 220, 50, 14 - PUSHBUTTON "´òÓ¡»ú(&P)...", psh3, 184, 220, 48, 14 -END - -NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 -STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN -CAPTION "´ò¿ª" -FONT 8, "MS Shell Dlg" -{ - LTEXT "ËÑÑ°(&I)",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY - COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP - - LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE - LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE - - LTEXT "ÎļþÃû(&N):",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY - EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL - - LTEXT "ÎļþÀàÐÍ(&t)",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY - COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - - CONTROL "Ö»¶Á(&r)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 - - DEFPUSHBUTTON "´ò¿ª(&O)", IDOK,222,110,50,14 - PUSHBUTTON "È¡Ïû", IDCANCEL,222,128,50,14 - PUSHBUTTON "°ïÖú(&H)", pshHelp,222,145,50,14 -} - -STRINGTABLE DISCARDABLE -{ - IDS_ABOUTBOX "¹ØÓÚÎļþ¼ÐÑ¡ÔñÆ÷(&A)" - IDS_DOCUMENTFOLDERS "ÎĵµÄ¿Â¼" - IDS_PERSONAL "ÎÒµÄÎĵµ" - IDS_FAVORITES "ÊղؼÐ" - IDS_PATH "ϵͳ·¾¶" - IDS_DESKTOP "×ÀÃæ" - IDS_FONTS "×ÖÌå" - IDS_MYCOMPUTER "ÎҵĵçÄÔ" -} - -STRINGTABLE DISCARDABLE -{ - IDS_SYSTEMFOLDERS "ϵͳÎļþ¼Ð" - IDS_LOCALHARDRIVES "±¾µØÓ²ÅÌÇý¶¯Æ÷" - IDS_FILENOTFOUND "ÕÒ²»µ½Îļþ" - IDS_VERIFYFILE "Çë¼ìÑéÊÇ·ñ¸øÓèÕýÈ·µÄÎļþÃû³Æ¡£" - IDS_CREATEFILE "ÕÒ²»µ½Îļþ\nÊÇ·ñ´´½¨ÐÂÎļþ?" - IDS_OVERWRITEFILE "ÎļþÒѾ­´æÔÚ¡£\nÒªÌæ»»Âð?" - IDS_INVALID_FILENAME_TITLE "ÎļþÃûÖдæÔÚÎÞЧµÄ×Ö·û" - IDS_INVALID_FILENAME "ÎļþÃûÖв»ÄÜ°üº¬ÈκÎÒ»ÏÂ×Ö·û::\n / : < > |" - IDS_PATHNOTEXISTING "Îļþ¼Ð²»´æÔÚ" - IDS_FILENOTEXISTING "Îļþ²»´æÔÚ" -} - -STRINGTABLE DISCARDABLE -{ - IDS_UPFOLDER "ÏòÉÏÒÆÒ»²ã" - IDS_NEWFOLDER "н¨Îļþ¼Ð" - IDS_LISTVIEW "Áбí" - IDS_REPORTVIEW "Ïêϸ×ÊÁÏ" - IDS_TODESKTOP "²é¿´×ÀÃæ" -} - -STRINGTABLE DISCARDABLE -{ - PD32_PRINT_TITLE "´òÓ¡" - - PD32_VALUE_UREADABLE "ÊýÖµ²»¿É¶Á" - PD32_INVALID_PAGE_RANGE "Õâ¸öÖµ²»ÔÚÒ³Êý·¶Î§¡£\n \ -ÇëÊäÈëÒ»¸ö %d ºÍ %d Ö®¼äµÄÊý¡£" - PD32_FROM_NOT_ABOVE_TO "'´Ó'ÏîµÄÖµ²»ÄÜ´óÓÚ'µ½'ÏîµÄÖµ¡£" - PD32_MARGINS_OVERLAP "Ò³±ß¾àÖصü»òÂäÓÚÖ½Íâ,\nÇëÖØÐÂÊäÈëÒ³±ß¾à¡£" - PD32_NR_OF_COPIES_EMPTY "'·ÝÊý' Ïî²»ÄÜ¿Õ." - PD32_TOO_LARGE_COPIES "ÄãµÄ´òÓ¡»ú²»Ö§³ÖÕâô´óµÄ·ÝÊý¡£\n \ -ÇëÊäÈëÒ»¸ö 1 ºÍ %d Ö®¼äµÄÊý¡£" - PD32_PRINT_ERROR "´òÓ¡»ú´íÎó¡£" - PD32_NO_DEFAULT_PRINTER "ûÓÐĬÈÏ´òÓ¡»ú¡£" - PD32_CANT_FIND_PRINTER "ÕÒ²»µ½´òÓ¡»ú¡£" - PD32_OUT_OF_MEMORY "ÄÚ´æ²»¹»¡£" - PD32_GENERIC_ERROR "³öÏÖһЩ´íÎó¡£" - PD32_DRIVER_UNKNOWN "ÕÒ²»µ½´òÓ¡»úÇý¶¯Æ÷¡£" - PD32_NO_DEVICES "ÔÚʹÓÃÓë´òÓ¡»úÓйع¦ÄÜ(Ò³ÃæÉèÖÃ, ´òÓ¡Îļþ)֮ǰ, \ -Äã±ØÐëÏÈ×°´òÓ¡»ú¡£Çë×°Ò»¸ö´òÓ¡»úÔÙÊÔ¡£" - - PD32_DEFAULT_PRINTER "ĬÈÏ´òÓ¡»ú; " - PD32_NR_OF_DOCUMENTS_IN_QUEUE "ÓÐ %d ¸öÎĵµÕýÔڵȴý´òÓ¡" - PD32_MARGINS_IN_INCHES "Ò³±ß¾à [Ó¢´ç]" - PD32_MARGINS_IN_MILIMETERS "Ò³±ß¾à [ºÁÃ×]" - PD32_MILIMETERS "ºÁÃ×" - - PD32_PRINTER_STATUS_READY "´ýÃü" - PD32_PRINTER_STATUS_PAUSED "ÔÝÍ£; " - PD32_PRINTER_STATUS_ERROR "´íÎó; " - PD32_PRINTER_STATUS_PENDING_DELETION "µÈ´ýɾ³ý; " - PD32_PRINTER_STATUS_PAPER_JAM "¿¨Ö½; " - PD32_PRINTER_STATUS_PAPER_OUT "ÎÞÖ½; " - PD32_PRINTER_STATUS_MANUAL_FEED "ÊÖ¶¯½øÖ½; " - PD32_PRINTER_STATUS_PAPER_PROBLEM "Ö½µÄÎÊÌâ; " - PD32_PRINTER_STATUS_OFFLINE "´òÓ¡»úÀëÏß; " - PD32_PRINTER_STATUS_IO_ACTIVE "I/O »î¶¯; " - PD32_PRINTER_STATUS_BUSY "·±Ã¦; " - PD32_PRINTER_STATUS_PRINTING "ÕýÔÚ´òÓ¡; " - PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "³öÖ½ÍÐÅÌÒÑÂú; " - PD32_PRINTER_STATUS_NOT_AVAILABLE "²»¿ÉÓÃ; " - PD32_PRINTER_STATUS_WAITING "µÈ´ý; " - PD32_PRINTER_STATUS_PROCESSING "ÕýÔÚ´¦Àí; " - PD32_PRINTER_STATUS_INITIALIZING "ÕýÔÚÆô¶¯; " - PD32_PRINTER_STATUS_WARMING_UP "Ô¤ÈÈ; " - PD32_PRINTER_STATUS_TONER_LOW "Ä«µÍ; " - PD32_PRINTER_STATUS_NO_TONER "ûī; " - PD32_PRINTER_STATUS_PAGE_PUNT "Ò³Äڴ泬֧; " - PD32_PRINTER_STATUS_USER_INTERVENTION "Óû§¸ÉÔ¤; " - PD32_PRINTER_STATUS_OUT_OF_MEMORY "ÄÚ´æ²»¹»; " - PD32_PRINTER_STATUS_DOOR_OPEN "´òÓ¡»ú¸ÇÊÇ´ò¿ªµÄ; " - PD32_PRINTER_STATUS_SERVER_UNKNOWN "ÕÒ²»µ½´òÓ¡·þÎñÆ÷; " - PD32_PRINTER_STATUS_POWER_SAVE "Ê¡µç״̬; " -} - -#pragma code_page(default) diff --git a/dlls/comdlg32/cdlg_Zh.rc b/dlls/comdlg32/cdlg_Zh.rc index 77bcc0008f1..870ae481d17 100644 --- a/dlls/comdlg32/cdlg_Zh.rc +++ b/dlls/comdlg32/cdlg_Zh.rc @@ -1,5 +1,9 @@ /* + * comdlg32 (Traditional Chinese Resource) + * * Copyright 2000 Aric Stewart + * Copyright 2002 Tisheng Chen + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,79 +24,501 @@ * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "打开" +FONT 9, "MS Song" +{ + LTEXT "文件名(&N):", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "文件夹(&D):", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "文件类型(&T):", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "驱动器(&v):", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "打开", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助(&H)", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "只读(&R)", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "另存为..." +FONT 9, "MS Song" +{ + LTEXT "文件名(&N):", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "目录(&D):", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "文件类型(&T):", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "驱动器(&v):", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "保存", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助(&H)", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "只读(&R)", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "打印" +FONT 9, "MS Song" +{ + LTEXT "打印机:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "打印范围", grp1, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "全部(&A)", rad1, 16, 45, 60, 12 + RADIOBUTTON "选择的范围(&e)", rad2, 16, 60, 60, 12 + RADIOBUTTON "页数(&G)", rad3, 16, 75, 60, 12 + DEFPUSHBUTTON "确定", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "设置(&S)", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "从(&F):", 1090, 60, 80, 30, 9 + LTEXT "到(&T):", 1091, 120, 80, 30, 9 + LTEXT "打印质量(&Q):", 1092, 6, 100, 76, 9 + COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "打印到文件(&l):", chx1, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "压小", chx2, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "打印设置" +FONT 9, "MS Song" +{ + GROUPBOX "打印机", grp1, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "默认打印机(&D)", rad1, 16, 20, 80, 12 + LTEXT "[无]", 1088, 35, 35, 120, 9 + RADIOBUTTON "指定的打印机(&P)", rad2, 16, 50, 80, 12 + COMBOBOX cmb1, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "确定", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "设置(&S)", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "方向(&O)", grp2, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "纵向(&P)", rad3, 50, 100, 40, 12 + RADIOBUTTON "横向(&L)", rad4, 50, 115, 40, 12 + ICON "LANDSCAP", stc10, 10, 95, 32, 32 + ICON "PORTRAIT", stc11, 10, 95, 32, 32 + GROUPBOX "纸张", grp3, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "纸张大小(&Z)", 1089, 130, 95, 30, 9 + LTEXT "纸张来源(&S)", 1090, 130, 110, 30, 9 + COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "字体" +FONT 9, "MS Song" +{ + LTEXT "字体(&F):",1088 ,6,3,40,9 + COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "字体样式(&y):",1089 ,108,3,44,9 + COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "大小(&S):",1090,179,3,30,9 + COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "确定",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "应用(&A)", psh3,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助(&H)" , pshHelp,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "效果",1072,6,72,84,34,WS_GROUP + CHECKBOX "删除线(&k)", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "下划线(&U)", chx2, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "颜色(&C):", 1091 ,6,110,30,9 + COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "示例",grp2,98,72,120,36,WS_GROUP + CTEXT "中文字体AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "语言(&i):",stc7,98,114,80,9 + COMBOBOX cmb5,98,124,120,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "颜色" +FONT 9, "MS Song" +{ + LTEXT "基本颜色(&B):", 1088, 4, 4, 140, 10 + LTEXT "自定制颜色(&C):", 1089, 4, 106, 140, 10 + LTEXT "颜色|纯色(&O)", 1090, 150, 151, 48, 10 + LTEXT "红(&R):", 726 /*1094*/,249,126,24,10 + EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "绿(&G):",727/*1095*/,249,140,24,10 + EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "蓝(&B):",728 /*1096*/,249,154,24,10 + EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "色调(&E):" ,723 /*1091*/,202,126,22,10 + EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "饱和度(&S):" ,724 /*1092*/,202,140,22,10 + EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "亮度(&L)" ,725 /*1093*/,202,154,22,10 + EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 + CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 + CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 + DEFPUSHBUTTON "确定", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助", pshHelp,100,166, 44, 14 + PUSHBUTTON "添加到自定制颜色(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "规定自定义颜色(&D)>>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ +} + + +FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "查找" +FONT 9, "MS Song" +{ + LTEXT "查找(&n):", -1, 4, 8, 42, 8 + EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "全字匹配(&W)", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "区分大小写(&C)", chx2, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "方向", grp1, 107, 26, 68, 28 + CONTROL "上(&U)", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 + CONTROL "下(&D)", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + + DEFPUSHBUTTON "找下一个(&F)", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL , 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助(&H)", pshHelp , 182, 45, 50, 14, WS_GROUP | WS_TABSTOP +} + + +REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "替换" +FONT 9, "MS Song" +{ + LTEXT "查找(&n):", -1, 4, 9, 48, 8 + EDITTEXT edt1, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "替换为(&p):", -1, 4, 26, 48, 8 + EDITTEXT edt2, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "全字匹配(&W)", chx1, 5, 46, 104, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "区分大小写(&C)", chx2, 5, 62, 59, 12, BS_AUTOCHECKBOX | WS_TABSTOP + + DEFPUSHBUTTON "找下一个(&F)", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "替换(&R)", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "全部替换(&A)", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "帮助(&H)", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +} + + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "打印" +FONT 9, "MS Song" +{ + DEFPUSHBUTTON "确定", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "帮助(&H)", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "打印机", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "打印到文件(&l)", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "属性(&P)", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "名称(&N):", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "状态:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "型号:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "位置:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "备注:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "份数", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "份数(&C):",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "自动分页(&o)", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "打印范围", grp1, 8,92, 144,64, WS_GROUP + CONTROL "全部(&A)", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "页数(&G)", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 + CONTROL "选择的范围(&S)", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER + RTEXT "从(&f):", stc2, 52,124, 20,8 + RTEXT "到(&t):", stc3, 100,124, 16,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "打印设置" +FONT 9, "MS Song" +BEGIN + DEFPUSHBUTTON "确定",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "Network...", psh5, 284,156,48,14 */ + + GROUPBOX "打印机", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "属性(&P)", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "名称(&N):", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "状态:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "型号:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "位置:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "备注:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "纸张", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "纸张大小(&z):", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "纸张来源(&S):", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "方向", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "纵向(&P)", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "横向(&L)", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "页面设置" +FONT 9, "MS Song" +BEGIN + CONTROL "", rct1, "Static", SS_WHITERECT, 80, 8, 80, 80 + CONTROL "", rct2, "Static", SS_GRAYRECT, 160, 12, 4, 80 + CONTROL "", rct3, "Static", SS_GRAYRECT, 84, 88, 80, 4 + GROUPBOX "纸张", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "大小(&S):", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "来源(&S):", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "方向(&O)", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "纵向(&P)", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "横向(&L)", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "边距", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "左(&e):", stc15, 88, 172, 21, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "右(&R):", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "上(&o):", stc17, 88, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "下(&B):", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + DEFPUSHBUTTON "确定", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "打印机(&P)...", psh3, 184, 220, 48, 14 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "打开" +FONT 9, "MS Song" +{ + LTEXT "搜寻(&I)",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "文件名(&N):",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "文件类型(&t)",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + CONTROL "只读(&r)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + + DEFPUSHBUTTON "打开(&O)", IDOK,222,110,50,14 + PUSHBUTTON "取消", IDCANCEL,222,128,50,14 + PUSHBUTTON "帮助(&H)", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "关于文件夹选择器(&A)" + IDS_DOCUMENTFOLDERS "文档目录" + IDS_PERSONAL "我的文档" + IDS_FAVORITES "收藏夹" + IDS_PATH "系统路径" + IDS_DESKTOP "桌面" + IDS_FONTS "字体" + IDS_MYCOMPUTER "我的电脑" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "系统文件夹" + IDS_LOCALHARDRIVES "本地硬盘驱动器" + IDS_FILENOTFOUND "找不到文件" + IDS_VERIFYFILE "请检验是否给予正确的文件名称。" + IDS_CREATEFILE "找不到文件\n是否创建新文件?" + IDS_OVERWRITEFILE "文件已经存在。\n要替换吗?" + IDS_INVALID_FILENAME_TITLE "文件名中存在无效的字符" + IDS_INVALID_FILENAME "文件名中不能包含任何一下字符::\n / : < > |" + IDS_PATHNOTEXISTING "文件夹不存在" + IDS_FILENOTEXISTING "文件不存在" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "向上移一层" + IDS_NEWFOLDER "新建文件夹" + IDS_LISTVIEW "列表" + IDS_REPORTVIEW "详细资料" + IDS_TODESKTOP "查看桌面" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "打印" + + PD32_VALUE_UREADABLE "数值不可读" + PD32_INVALID_PAGE_RANGE "这个值不在页数范围。\n \ +请输入一个 %d 和 %d 之间的数。" + PD32_FROM_NOT_ABOVE_TO "'从'项的值不能大于'到'项的值。" + PD32_MARGINS_OVERLAP "页边距重迭或落于纸外,\n请重新输入页边距。" + PD32_NR_OF_COPIES_EMPTY "'份数' 项不能空." + PD32_TOO_LARGE_COPIES "你的打印机不支持这么大的份数。\n \ +请输入一个 1 和 %d 之间的数。" + PD32_PRINT_ERROR "打印机错误。" + PD32_NO_DEFAULT_PRINTER "没有默认打印机。" + PD32_CANT_FIND_PRINTER "找不到打印机。" + PD32_OUT_OF_MEMORY "内存不够。" + PD32_GENERIC_ERROR "出现一些错误。" + PD32_DRIVER_UNKNOWN "找不到打印机驱动器。" + PD32_NO_DEVICES "在使用与打印机有关功能(页面设置, 打印文件)之前, \ +你必须先装打印机。请装一个打印机再试。" + + PD32_DEFAULT_PRINTER "默认打印机; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "有 %d 个文档正在等待打印" + PD32_MARGINS_IN_INCHES "页边距 [英寸]" + PD32_MARGINS_IN_MILIMETERS "页边距 [毫米]" + PD32_MILIMETERS "毫米" + + PD32_PRINTER_STATUS_READY "待命" + PD32_PRINTER_STATUS_PAUSED "暂停; " + PD32_PRINTER_STATUS_ERROR "错误; " + PD32_PRINTER_STATUS_PENDING_DELETION "等待删除; " + PD32_PRINTER_STATUS_PAPER_JAM "卡纸; " + PD32_PRINTER_STATUS_PAPER_OUT "无纸; " + PD32_PRINTER_STATUS_MANUAL_FEED "手动进纸; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "纸的问题; " + PD32_PRINTER_STATUS_OFFLINE "打印机离线; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O 活动; " + PD32_PRINTER_STATUS_BUSY "繁忙; " + PD32_PRINTER_STATUS_PRINTING "正在打印; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "出纸托盘已满; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "不可用; " + PD32_PRINTER_STATUS_WAITING "等待; " + PD32_PRINTER_STATUS_PROCESSING "正在处理; " + PD32_PRINTER_STATUS_INITIALIZING "正在启动; " + PD32_PRINTER_STATUS_WARMING_UP "预热; " + PD32_PRINTER_STATUS_TONER_LOW "墨低; " + PD32_PRINTER_STATUS_NO_TONER "没墨; " + PD32_PRINTER_STATUS_PAGE_PUNT "页内存超支; " + PD32_PRINTER_STATUS_USER_INTERVENTION "用户干预; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "内存不够; " + PD32_PRINTER_STATUS_DOOR_OPEN "打印机盖是打开的; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "找不到打印服务器; " + PD32_PRINTER_STATUS_POWER_SAVE "省电状态; " +} + + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#pragma code_page(936) /* FIXME: default for CHINESE_TRADITIONAL is 950 */ OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "é_†¢" -FONT 8, "MS Shell Dlg" +CAPTION "開啟" +FONT 8, "PMingLiu" { - LTEXT "™n°¸Ãû·Q(&N):", 1090, 6, 6, 100, 9 + LTEXT "檔案名稱(&N):", 1090, 6, 6, 100, 9 EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "Ä¿ä›(&D):", -1, 110, 6, 92, 9 + LTEXT "目錄(&D):", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "™n°¸î�ÐÍ(&T):", 1089, 6, 104, 90, 9 + LTEXT "檔案類型(&T):", 1089, 6, 104, 90, 9 COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "´Åµú™C(&V):", 1091, 110, 104, 92, 9 + LTEXT "磁碟機(&V):", 1091, 110, 104, 92, 9 COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "é_†¢", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "Ψ×x(&R)", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "開啟", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "唯讀(&R)", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Áí´æЙn..." -FONT 8, "MS Shell Dlg" +CAPTION "另存新檔..." +FONT 8, "PMingLiu" { - LTEXT "™n°¸Ãû·Q(&N):", 1090, 6, 6, 76, 9 + LTEXT "檔案名稱(&N):", 1090, 6, 6, 76, 9 EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "Ä¿ä›(&D):", -1, 110, 6, 92, 9 + LTEXT "目錄(&D):", -1, 110, 6, 92, 9 LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "´æ™nî�ÐÍ(&T):", 1089, 6, 104, 90, 9 + LTEXT "存檔類型(&T):", 1089, 6, 104, 90, 9 COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - LTEXT "´Åµú™C(&V):", 1091, 110, 104, 92, 9 + LTEXT "磁碟機(&V):", 1091, 110, 104, 92, 9 COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Áí´æЙn", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "Ψ×x(&R)", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "另存新檔", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "唯讀(&R)", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 294, 147 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "×ÖÐÍ" -FONT 8, "MS Shell Dlg" +CAPTION "字型" +FONT 8, "PMingLiu" { - LTEXT "×ÖÐÍ(&F):",1088 ,6,3,40,9 + LTEXT "字型(&F):",1088 ,6,3,40,9 COMBOBOX 1136 ,6,13,124,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "×ÖÐ͘Óʽ(&Y):",1089 ,138,3,44,9 + LTEXT "字型樣式(&Y):",1089 ,138,3,44,9 COMBOBOX 1137,138,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "´óС(&S):",1090,209,3,30,9 + LTEXT "大小(&S):",1090,209,3,30,9 COMBOBOX 1138,209,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT - DEFPUSHBUTTON "´_¶¨",IDOK,248,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡Ïû",IDCANCEL,248,23,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "Ì×ÓÃ(&A)", 1026,248,40,40,14,WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)" , 1038,248,57,40,14,WS_GROUP | WS_TABSTOP - GROUPBOX "Ч¹û",1072,6,72,84,34,WS_GROUP - CHECKBOX "„h³ý¾€(&K)", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "µ×¾€(&U)", 1041, 10,94,50,10, BS_AUTOCHECKBOX - LTEXT "É«²Ê(&C):", 1091 ,6,110,30,9 + DEFPUSHBUTTON "確定",IDOK,248,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消",IDCANCEL,248,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "套用(&A)", 1026,248,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)" , 1038,248,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "效果",1072,6,72,84,34,WS_GROUP + CHECKBOX "刪除線(&K)", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "底線(&U)", 1041, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "色彩(&C):", 1091 ,6,110,30,9 COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP - GROUPBOX "¹ Àý",grp2,98,72,120,36,WS_GROUP + GROUPBOX "範例",grp2,98,72,120,36,WS_GROUP CTEXT "AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE - LTEXT "Scr&ipt (translate):",stc7 ,98,114,80,9 + LTEXT "语言:",stc7 ,98,114,80,9 COMBOBOX cmb5,98,124,120,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP } @@ -100,133 +526,188 @@ FONT 8, "MS Shell Dlg" CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "É«²Ê" -FONT 8, "MS Shell Dlg" +CAPTION "色彩" +FONT 8, "PMingLiu" { - LTEXT "»ù±¾É«²Ê(&B):", 1088, 4, 4, 140, 10 - LTEXT "×Ô¶¨É«²Ê(&C):", 1089, 4, 106, 140, 10 - LTEXT "É«²Ê | Œ�ÐÄ(&I)", 1090, 150, 151, 48, 10 - LTEXT "¼t(&R):", 726 /*1094*/,249,126,24,10 + LTEXT "基本色彩(&B):", 1088, 4, 4, 140, 10 + LTEXT "自定色彩(&C):", 1089, 4, 106, 140, 10 + LTEXT "色彩 | 實心(&I)", 1090, 150, 151, 48, 10 + LTEXT "紅(&R):", 726 /*1094*/,249,126,24,10 EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "¾G(&G):",727/*1095*/,249,140,24,10 + LTEXT "綠(&G):",727/*1095*/,249,140,24,10 EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "Ë{(&B):",728 /*1096*/,249,154,24,10 + LTEXT "藍(&B):",728 /*1096*/,249,154,24,10 EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "É«Õ{(&H):" ,723 /*1091*/,202,126,22,10 + LTEXT "色調(&H):" ,723 /*1091*/,202,126,22,10 EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "�â¶È(&S):" ,724 /*1092*/,202,140,22,10 + LTEXT "濃度(&S):" ,724 /*1092*/,202,140,22,10 EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "ÁÁ¶È(&L):" ,725 /*1093*/,202,154,22,10 + LTEXT "亮度(&L):" ,725 /*1093*/,202,154,22,10 EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 - DEFPUSHBUTTON "´_¶¨", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)", 1038,100,166, 44, 14 - PUSHBUTTON "ÐÂÔö×Ô¶¨É«²Ê(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "¶¨Áx×Ô¶¨É«²Ê(&D) >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "確定", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)", 1038,100,166, 44, 14 + PUSHBUTTON "新增自定色彩(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "定義自定色彩(&D) >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ } FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 263, 62 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ËÑŒ¤" -FONT 8, "MS Shell Dlg" +CAPTION "搜尋" +FONT 8, "PMingLiu" { - LTEXT "ËÑŒ¤Ä¿˜Ë(&N):", -1, 4, 8, 50, 8 + LTEXT "搜尋目標(&N):", -1, 4, 8, 50, 8 EDITTEXT 1152, 61, 7, 130, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "È«×ÖÆ´Œ‘íš·ûºÏ(&W)", 1040, 4, 26, 89, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "´óСŒ‘Ò•žéÏà®�(&C)", 1041, 4, 42, 89, 12, BS_AUTOCHECKBOX | WS_TABSTOP - GROUPBOX "·½Ïò", 1072, 95, 26, 97, 28 - CONTROL "ÏòÉÏ(&U)", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 100, 38, 45, 12 - CONTROL "ÏòÏÂ(&D)", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 145, 38, 45, 12 + CHECKBOX "全字拼寫須符合(&W)", 1040, 4, 26, 89, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "大小寫視為相異(&C)", 1041, 4, 42, 89, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "方向", 1072, 95, 26, 97, 28 + CONTROL "向上(&U)", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 100, 38, 45, 12 + CONTROL "向下(&D)", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 145, 38, 45, 12 - DEFPUSHBUTTON "ÕÒÏÂÒ»‚€(&F)", IDOK, 199, 5, 60, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡Ïû", IDCANCEL , 199, 23, 60, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)", pshHelp , 199, 45, 60, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "找下一個(&F)", IDOK, 199, 5, 60, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL , 199, 23, 60, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)", pshHelp , 199, 45, 60, 14, WS_GROUP | WS_TABSTOP } REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 263, 94 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "È¡´ú" -FONT 8, "MS Shell Dlg" +CAPTION "取代" +FONT 8, "PMingLiu" { - LTEXT "Œ¤ÕÒÄ¿˜Ë(&N):", -1, 4, 9, 50, 8 + LTEXT "尋找目標(&N):", -1, 4, 9, 50, 8 EDITTEXT 1152, 61, 7, 130, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "È¡´úžé(&P):", -1, 4, 26, 50, 8 + LTEXT "取代為(&P):", -1, 4, 26, 50, 8 EDITTEXT 1153, 61, 24, 130, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "È«×ÖÆ´Œ‘íš·ûºÏ(&W)", 1040, 5, 46, 89, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "´óСŒ‘Ò•žéÏë®�(&C)", 1041, 5, 62, 89, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "全字拼寫須符合(&W)", 1040, 5, 46, 89, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "大小寫視為相異(&C)", 1041, 5, 62, 89, 12, BS_AUTOCHECKBOX | WS_TABSTOP - DEFPUSHBUTTON "ÕÒÏÂÒ»‚€(&F)", IDOK, 199, 4, 60, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON - PUSHBUTTON "È¡´ú(&R)", psh1 , 199, 21, 60, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡´úÈ«²¿(&A)", psh2 , 199, 38, 60, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "È¡Ïû", IDCANCEL , 199, 55, 60, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "ÇóÖú(&H)", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "找下一個(&F)", IDOK, 199, 4, 60, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取代(&R)", psh1 , 199, 21, 60, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "取代全部(&A)", psh2 , 199, 38, 60, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL , 199, 55, 60, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "求助(&H)", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP } NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN -CAPTION "é_†¢Åf™n" -FONT 8, "MS Shell Dlg" +CAPTION "開啟舊檔" +FONT 8, "PMingLiu" { - LTEXT "ËÑŒ¤Î»ÖÃ(&I)",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + LTEXT "搜尋位置(&I)",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY COMBOBOX IDC_LOOKIN,52,3,130,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE - LTEXT "™n°¸Ãû·Q(&N):",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + LTEXT "檔案名稱(&N):",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY EDITTEXT IDC_FILENAME,59,110,155,12,ES_AUTOHSCROLL - LTEXT "™n°¸î�ÐÍ(&T):",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + LTEXT "檔案類型(&T):",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY COMBOBOX IDC_FILETYPE,59,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "é_†¢³ÉΨ×x(&R)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + CONTROL "開啟成唯讀(&R)",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 - DEFPUSHBUTTON "é_†¢(&O)", IDOK,222,110,50,14 - PUSHBUTTON "È¡Ïû", IDCANCEL,222,128,50,14 - PUSHBUTTON "ÇóÖú(&H)", pshHelp,222,145,50,14 + DEFPUSHBUTTON "開啟(&O)", IDOK,222,110,50,14 + PUSHBUTTON "取消", IDCANCEL,222,128,50,14 + PUSHBUTTON "求助(&H)", pshHelp,222,145,50,14 } STRINGTABLE DISCARDABLE { - IDS_ABOUTBOX "&About FolderPicker Test" - IDS_DOCUMENTFOLDERS "ÎļþŠA" - IDS_PERSONAL "ÎÒµÄÎļþ" - IDS_FAVORITES "ÎÒµÄ×î�Û" - IDS_PATH "ϵ½y·�½" - IDS_DESKTOP "×ÀÃæ" - IDS_FONTS "×ÖÐÍ" - IDS_MYCOMPUTER "ÎÒµÄëŠÄX" + IDS_ABOUTBOX "关于資料夹选择器(&A)" + IDS_DOCUMENTFOLDERS "資料夾" + IDS_PERSONAL "我的檔案" + IDS_FAVORITES "我的最愛" + IDS_PATH "系統路徑" + IDS_DESKTOP "桌面" + IDS_FONTS "字型" + IDS_MYCOMPUTER "我的電腦" } STRINGTABLE DISCARDABLE { - IDS_SYSTEMFOLDERS "System Folders" - IDS_LOCALHARDRIVES "Local Hard Drives" - IDS_FILENOTFOUND "File not found" - IDS_VERIFYFILE "Please verify if the correct file name was given" - IDS_CREATEFILE "File does not exist\nDo you want to create file" - IDS_OVERWRITEFILE "File does already exist.\nDo you want to replace it?" - IDS_INVALID_FILENAME_TITLE "Invalid character(s) in path" - IDS_INVALID_FILENAME "A filename cannot contain any of the following characters:\n / : < > |" - IDS_PATHNOTEXISTING "Path does not exist" - IDS_FILENOTEXISTING "File does not exist" + IDS_SYSTEMFOLDERS "系統資料夾" + IDS_LOCALHARDRIVES "本地硬盤驅動器" + IDS_FILENOTFOUND "找不到檔案" + IDS_VERIFYFILE "請檢驗是否給予正確的檔案名稱。" + IDS_CREATEFILE "找不到檔案\n是否創建新檔案?" + IDS_OVERWRITEFILE "檔案已經存在。\n要替換嗎?" + IDS_INVALID_FILENAME_TITLE "檔案名中存在無效的字符" + IDS_INVALID_FILENAME "檔案名中不能包含任何一下字符::\n / : < > |" + IDS_PATHNOTEXISTING "資料夾不存在" + IDS_FILENOTEXISTING "檔案不存在" } STRINGTABLE DISCARDABLE { - IDS_UPFOLDER "ÏòÉÏÒ»ŒÓ" - IDS_NEWFOLDER "½¨Á¢ÐÂÙYÁÏŠA" - IDS_LISTVIEW "Çå†Î" - IDS_REPORTVIEW "Ô”¼šÙYÁÏ" - IDS_TODESKTOP "ï@ʾ×ÀÃæ" + IDS_UPFOLDER "向上一層" + IDS_NEWFOLDER "建立新資料夾" + IDS_LISTVIEW "清單" + IDS_REPORTVIEW "詳細資料" + IDS_TODESKTOP "顯示桌面" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "列印" + + PD32_VALUE_UREADABLE "數值不可讀" + PD32_INVALID_PAGE_RANGE "這個值不在頁數範圍。\n \ +請輸入一個 %d 和 %d 之間的數。" + PD32_FROM_NOT_ABOVE_TO "'從'項的值不能大於'到'項的值。" + PD32_MARGINS_OVERLAP "邊緣空白重迭或落於紙外,\n請重新輸入邊緣空白。" + PD32_NR_OF_COPIES_EMPTY "'份數' 項不能空." + PD32_TOO_LARGE_COPIES "你的印表機不支持這麼大的份數。\n \ +請輸入一個 1 和 %d 之間的數。" + PD32_PRINT_ERROR "印表機錯誤。" + PD32_NO_DEFAULT_PRINTER "沒有默認印表機。" + PD32_CANT_FIND_PRINTER "找不到印表機。" + PD32_OUT_OF_MEMORY "內存不夠。" + PD32_GENERIC_ERROR "出現一些錯誤。" + PD32_DRIVER_UNKNOWN "找不到印表機驅動器。" + PD32_NO_DEVICES "在使用與印表機有關功能(版面設定, 列印檔案)之前, \ +你必須先裝印表機。請裝一個印表機再試。" + + PD32_DEFAULT_PRINTER "默認印表機; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "有 %d 個文檔正在等待列印" + PD32_MARGINS_IN_INCHES "邊緣空白 [英寸]" + PD32_MARGINS_IN_MILIMETERS "邊緣空白 [毫米]" + PD32_MILIMETERS "毫米" + + PD32_PRINTER_STATUS_READY "待命" + PD32_PRINTER_STATUS_PAUSED "暫停; " + PD32_PRINTER_STATUS_ERROR "錯誤; " + PD32_PRINTER_STATUS_PENDING_DELETION "等待刪除; " + PD32_PRINTER_STATUS_PAPER_JAM "卡紙; " + PD32_PRINTER_STATUS_PAPER_OUT "無紙; " + PD32_PRINTER_STATUS_MANUAL_FEED "手動進紙; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "紙的問題; " + PD32_PRINTER_STATUS_OFFLINE "印表機離線; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O 活動; " + PD32_PRINTER_STATUS_BUSY "繁忙; " + PD32_PRINTER_STATUS_PRINTING "正在列印; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "出紙托盤已滿; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "不可用; " + PD32_PRINTER_STATUS_WAITING "等待; " + PD32_PRINTER_STATUS_PROCESSING "正在處理; " + PD32_PRINTER_STATUS_INITIALIZING "正在啓動; " + PD32_PRINTER_STATUS_WARMING_UP "預熱; " + PD32_PRINTER_STATUS_TONER_LOW "墨低; " + PD32_PRINTER_STATUS_NO_TONER "沒墨; " + PD32_PRINTER_STATUS_PAGE_PUNT "頁處理內存超支; " + PD32_PRINTER_STATUS_USER_INTERVENTION "用戶干預; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "內存不夠; " + PD32_PRINTER_STATUS_DOOR_OPEN "印表機蓋是打開的; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "找不到列印服務器; " + PD32_PRINTER_STATUS_POWER_SAVE "省電狀態; " } #pragma code_page(default) diff --git a/dlls/comdlg32/rsrc.rc b/dlls/comdlg32/rsrc.rc index 1b1dad3aa7e..18dac1b3db6 100644 --- a/dlls/comdlg32/rsrc.rc +++ b/dlls/comdlg32/rsrc.rc @@ -43,7 +43,6 @@ */ #include "cdlg_Bg.rc" #include "cdlg_Ca.rc" -#include "cdlg_Cn.rc" #include "cdlg_Cs.rc" #include "cdlg_Da.rc" #include "cdlg_De.rc" diff --git a/dlls/crypt32/crl.c b/dlls/crypt32/crl.c index 9caf46d6033..23c623fe1f3 100644 --- a/dlls/crypt32/crl.c +++ b/dlls/crypt32/crl.c @@ -386,7 +386,7 @@ static BOOL CRLContext_SetProperty(PCCRL_CONTEXT context, DWORD dwPropId, DWORD dwFlags, const void *pvData) { PCONTEXT_PROPERTY_LIST properties = - Context_GetProperties(context, sizeof(CERT_CONTEXT)); + Context_GetProperties(context, sizeof(CRL_CONTEXT)); BOOL ret; TRACE("(%p, %d, %08x, %p)\n", context, dwPropId, dwFlags, pvData); diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec index fab52a0a0bf..a5af07d8d89 100644 --- a/dlls/crypt32/crypt32.spec +++ b/dlls/crypt32/crypt32.spec @@ -185,7 +185,7 @@ @ stub CryptUnregisterOIDInfo @ stdcall CryptVerifyCertificateSignature(long long ptr long ptr) @ stdcall CryptVerifyCertificateSignatureEx(long long long ptr long ptr long ptr) -@ stub CryptVerifyDetachedMessageHash +@ stdcall CryptVerifyDetachedMessageHash(ptr ptr long long ptr ptr ptr ptr) @ stub CryptVerifyDetachedMessageSignature @ stub CryptVerifyMessageHash @ stdcall CryptVerifyMessageSignature(ptr long ptr long ptr ptr ptr) diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index a62482325f8..eb782d3e018 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -112,6 +112,9 @@ static BOOL CRYPT_AsnDecodeIntegerInternal(const BYTE *pbEncoded, static BOOL CRYPT_AsnDecodeUnsignedIntegerInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded); +static BOOL CRYPT_AsnDecodePKCSAttributesInternal(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded); /* Gets the number of length bytes from the given (leading) length byte */ #define GET_LEN_BYTES(b) ((b) <= 0x80 ? 1 : 1 + ((b) & 0x7f)) @@ -2033,6 +2036,116 @@ static BOOL CRYPT_DecodeDERArray(const BYTE *pbEncoded, DWORD cbEncoded, return ret; } +static BOOL CRYPT_AsnDecodeCTLUsage(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) +{ + BOOL ret; + struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF, + CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), TRUE, 0 }; + CTL_USAGE *usage = (CTL_USAGE *)pvStructInfo; + + ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, + NULL, pvStructInfo, pcbStructInfo, pcbDecoded, + usage ? usage->rgpszUsageIdentifier : NULL); + return ret; +} + +static BOOL CRYPT_AsnDecodeCTLEntry(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) +{ + struct AsnDecodeSequenceItem items[] = { + { ASN_OCTETSTRING, offsetof(CTL_ENTRY, SubjectIdentifier), + CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB), FALSE, TRUE, + offsetof(CTL_ENTRY, SubjectIdentifier.pbData), 0 }, + { ASN_CONSTRUCTOR | ASN_SETOF, offsetof(CTL_ENTRY, cAttribute), + CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES), FALSE, + TRUE, offsetof(CTL_ENTRY, rgAttribute), 0 }, + }; + BOOL ret = TRUE; + CTL_ENTRY *entry = (CTL_ENTRY *)pvStructInfo; + + TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags, entry, + *pcbStructInfo); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, NULL, entry, pcbStructInfo, + pcbDecoded, entry ? entry->SubjectIdentifier.pbData : NULL); + return ret; +} + +static BOOL CRYPT_AsnDecodeCTLEntries(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) +{ + BOOL ret; + struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF, + CRYPT_AsnDecodeCTLEntry, sizeof(CTL_ENTRY), TRUE, + offsetof(CTL_ENTRY, SubjectIdentifier.pbData) }; + struct GenericArray *entries = (struct GenericArray *)pvStructInfo; + + TRACE("%p, %d, %08x, %p, %d, %p\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, *pcbStructInfo, pcbDecoded); + + ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, + NULL, pvStructInfo, pcbStructInfo, pcbDecoded, + entries ? entries->rgItems : NULL); + return ret; +} + +static BOOL WINAPI CRYPT_AsnDecodeCTL(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret = FALSE; + + TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, *pcbStructInfo); + + __TRY + { + struct AsnDecodeSequenceItem items[] = { + { ASN_INTEGER, offsetof(CTL_INFO, dwVersion), + CRYPT_AsnDecodeIntInternal, sizeof(DWORD), TRUE, FALSE, 0, 0 }, + { ASN_SEQUENCEOF, offsetof(CTL_INFO, SubjectUsage), + CRYPT_AsnDecodeCTLUsage, sizeof(CTL_USAGE), FALSE, TRUE, + offsetof(CTL_INFO, SubjectUsage.rgpszUsageIdentifier), 0 }, + { ASN_OCTETSTRING, offsetof(CTL_INFO, ListIdentifier), + CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB), TRUE, + TRUE, offsetof(CTL_INFO, ListIdentifier.pbData), 0 }, + { ASN_INTEGER, offsetof(CTL_INFO, SequenceNumber), + CRYPT_AsnDecodeIntegerInternal, sizeof(CRYPT_INTEGER_BLOB), + TRUE, TRUE, offsetof(CTL_INFO, SequenceNumber.pbData), 0 }, + { 0, offsetof(CTL_INFO, ThisUpdate), + CRYPT_AsnDecodeChoiceOfTimeInternal, sizeof(FILETIME), FALSE, FALSE, + 0 }, + { 0, offsetof(CTL_INFO, NextUpdate), + CRYPT_AsnDecodeChoiceOfTimeInternal, sizeof(FILETIME), TRUE, FALSE, + 0 }, + { ASN_SEQUENCEOF, offsetof(CTL_INFO, SubjectAlgorithm), + CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER), + FALSE, TRUE, offsetof(CTL_INFO, SubjectAlgorithm.pszObjId), 0 }, + { ASN_SEQUENCEOF, offsetof(CTL_INFO, cCTLEntry), + CRYPT_AsnDecodeCTLEntries, sizeof(struct GenericArray), + TRUE, TRUE, offsetof(CTL_INFO, rgCTLEntry), 0 }, + { ASN_CONTEXT | ASN_CONSTRUCTOR | 0, offsetof(CTL_INFO, cExtension), + CRYPT_AsnDecodeCertExtensions, sizeof(CERT_EXTENSIONS), TRUE, TRUE, + offsetof(CTL_INFO, rgExtension), 0 }, + }; + + TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, *pcbStructInfo); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, + pcbStructInfo, NULL, NULL); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; +} + static BOOL CRYPT_AsnDecodeSMIMECapability(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) @@ -2640,6 +2753,52 @@ static BOOL WINAPI CRYPT_AsnDecodeAuthorityKeyId2(DWORD dwCertEncodingType, return ret; } +static BOOL CRYPT_AsnDecodeAccessDescription(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + struct AsnDecodeSequenceItem items[] = { + { 0, offsetof(CERT_ACCESS_DESCRIPTION, pszAccessMethod), + CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), FALSE, TRUE, + offsetof(CERT_ACCESS_DESCRIPTION, pszAccessMethod), 0 }, + { 0, offsetof(CERT_ACCESS_DESCRIPTION, AccessLocation), + CRYPT_AsnDecodeAltNameEntry, sizeof(CERT_ALT_NAME_ENTRY), FALSE, + TRUE, offsetof(CERT_ACCESS_DESCRIPTION, AccessLocation.u.pwszURL), 0 }, + }; + CERT_ACCESS_DESCRIPTION *descr = (CERT_ACCESS_DESCRIPTION *)pvStructInfo; + + return CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo, + pcbDecoded, descr ? descr->pszAccessMethod : NULL); +} + +static BOOL WINAPI CRYPT_AsnDecodeAuthorityInfoAccess(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret; + + TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, *pcbStructInfo); + + __TRY + { + struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF, + CRYPT_AsnDecodeAccessDescription, sizeof(CERT_ACCESS_DESCRIPTION), + TRUE, offsetof(CERT_ACCESS_DESCRIPTION, pszAccessMethod) }; + + ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, pcbStructInfo, NULL, NULL); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + ret = FALSE; + } + __ENDTRY + return ret; +} + static BOOL CRYPT_AsnDecodePKCSContent(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { @@ -4686,6 +4845,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, case LOWORD(X509_AUTHORITY_KEY_ID2): decodeFunc = CRYPT_AsnDecodeAuthorityKeyId2; break; + case LOWORD(X509_AUTHORITY_INFO_ACCESS): + decodeFunc = CRYPT_AsnDecodeAuthorityInfoAccess; + break; case LOWORD(PKCS_CONTENT_INFO): decodeFunc = CRYPT_AsnDecodePKCSContentInfo; break; @@ -4701,6 +4863,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, case LOWORD(X509_ENHANCED_KEY_USAGE): decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage; break; + case LOWORD(PKCS_CTL): + decodeFunc = CRYPT_AsnDecodeCTL; + break; case LOWORD(PKCS_SMIME_CAPABILITIES): decodeFunc = CRYPT_AsnDecodeSMIMECapabilities; break; @@ -4759,6 +4924,10 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, decodeFunc = CRYPT_AsnDecodeIssuingDistPoint; else if (!strcmp(lpszStructType, szOID_NAME_CONSTRAINTS)) decodeFunc = CRYPT_AsnDecodeNameConstraints; + else if (!strcmp(lpszStructType, szOID_AUTHORITY_INFO_ACCESS)) + decodeFunc = CRYPT_AsnDecodeAuthorityInfoAccess; + else if (!strcmp(lpszStructType, szOID_CTL)) + decodeFunc = CRYPT_AsnDecodeCTL; return decodeFunc; } diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c index c93539671db..9e7ed447ffc 100644 --- a/dlls/crypt32/encode.c +++ b/dlls/crypt32/encode.c @@ -93,6 +93,12 @@ static BOOL WINAPI CRYPT_AsnEncodeUnsignedInteger(DWORD dwCertEncodingType, static BOOL WINAPI CRYPT_AsnEncodeChoiceOfTime(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); +static BOOL WINAPI CRYPT_AsnEncodeEnhancedKeyUsage(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); +static BOOL WINAPI CRYPT_AsnEncodePKCSAttributes(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded) @@ -578,27 +584,31 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType, if (ret) dataLen += size; } - CRYPT_EncodeLen(dataLen, NULL, &lenBytes); - bytesNeeded = 1 + lenBytes + dataLen; - if (!pbEncoded) - *pcbEncoded = bytesNeeded; - else + if (ret) { - if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, - pcbEncoded, bytesNeeded))) + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else { - if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) - pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; - for (i = 0; i < cCRLEntry; i++) + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, + pcbEncoded, bytesNeeded))) { - DWORD size = dataLen; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < cCRLEntry; i++) + { + DWORD size = dataLen; - ret = CRYPT_AsnEncodeCRLEntry(&rgCRLEntry[i], pbEncoded, &size); - pbEncoded += size; - dataLen -= size; + ret = CRYPT_AsnEncodeCRLEntry(&rgCRLEntry[i], pbEncoded, + &size); + pbEncoded += size; + dataLen -= size; + } } } } @@ -731,28 +741,31 @@ static BOOL WINAPI CRYPT_AsnEncodeExtensions(DWORD dwCertEncodingType, if (ret) dataLen += size; } - CRYPT_EncodeLen(dataLen, NULL, &lenBytes); - bytesNeeded = 1 + lenBytes + dataLen; - if (!pbEncoded) - *pcbEncoded = bytesNeeded; - else + if (ret) { - if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, - pcbEncoded, bytesNeeded))) + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else { - if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) - pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; - for (i = 0; i < exts->cExtension; i++) + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, + pbEncoded, pcbEncoded, bytesNeeded))) { - DWORD size = dataLen; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < exts->cExtension; i++) + { + DWORD size = dataLen; - ret = CRYPT_AsnEncodeExtension(&exts->rgExtension[i], - pbEncoded, &size); - pbEncoded += size; - dataLen -= size; + ret = CRYPT_AsnEncodeExtension(&exts->rgExtension[i], + pbEncoded, &size); + pbEncoded += size; + dataLen -= size; + } } } } @@ -1404,6 +1417,193 @@ static BOOL WINAPI CRYPT_AsnEncodeUnicodeName(DWORD dwCertEncodingType, return ret; } +static BOOL WINAPI CRYPT_AsnEncodeCTLVersion(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + const DWORD *ver = (const DWORD *)pvStructInfo; + BOOL ret; + + /* CTL_V1 is not encoded */ + if (*ver == CTL_V1) + { + *pcbEncoded = 0; + ret = TRUE; + } + else + ret = CRYPT_AsnEncodeInt(dwCertEncodingType, X509_INTEGER, ver, + dwFlags, pEncodePara, pbEncoded, pcbEncoded); + return ret; +} + +/* Like CRYPT_AsnEncodeAlgorithmId, but encodes parameters as an asn.1 NULL + * if they are empty and the OID is not empty (otherwise omits them.) + */ +static BOOL WINAPI CRYPT_AsnEncodeCTLSubjectAlgorithm( + DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, + DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD *pcbEncoded) +{ + const CRYPT_ALGORITHM_IDENTIFIER *algo = + (const CRYPT_ALGORITHM_IDENTIFIER *)pvStructInfo; + BOOL ret; + struct AsnEncodeSequenceItem items[2] = { + { algo->pszObjId, CRYPT_AsnEncodeOid, 0 }, + }; + DWORD cItem = 1; + + if (algo->pszObjId) + { + static const BYTE asn1Null[] = { ASN_NULL, 0 }; + static const CRYPT_DATA_BLOB nullBlob = { sizeof(asn1Null), + (LPBYTE)asn1Null }; + + if (algo->Parameters.cbData) + items[cItem].pvStructInfo = &algo->Parameters; + else + items[cItem].pvStructInfo = &nullBlob; + items[cItem].encodeFunc = CRYPT_CopyEncodedBlob; + cItem++; + } + ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, cItem, + dwFlags, pEncodePara, pbEncoded, pcbEncoded); + return ret; +} + +static BOOL WINAPI CRYPT_AsnEncodeCTLEntry(const CTL_ENTRY *entry, + BYTE *pbEncoded, DWORD *pcbEncoded) +{ + struct AsnEncodeSequenceItem items[2] = { + { &entry->SubjectIdentifier, CRYPT_AsnEncodeOctets, 0 }, + { &entry->cAttribute, CRYPT_AsnEncodePKCSAttributes, 0 }, + }; + BOOL ret; + + ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, + sizeof(items) / sizeof(items[0]), 0, NULL, pbEncoded, pcbEncoded); + return ret; +} + +struct CTLEntries +{ + DWORD cEntry; + CTL_ENTRY *rgEntry; +}; + +static BOOL WINAPI CRYPT_AsnEncodeCTLEntries(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret; + DWORD bytesNeeded, dataLen, lenBytes, i; + const struct CTLEntries *entries = (const struct CTLEntries *)pvStructInfo; + + ret = TRUE; + for (i = 0, dataLen = 0; ret && i < entries->cEntry; i++) + { + DWORD size; + + ret = CRYPT_AsnEncodeCTLEntry(&entries->rgEntry[i], NULL, &size); + if (ret) + dataLen += size; + } + if (ret) + { + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else + { + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, + pbEncoded, pcbEncoded, bytesNeeded))) + { + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; ret && i < entries->cEntry; i++) + { + DWORD size = dataLen; + + ret = CRYPT_AsnEncodeCTLEntry(&entries->rgEntry[i], + pbEncoded, &size); + pbEncoded += size; + dataLen -= size; + } + } + } + } + return ret; +} + +static BOOL WINAPI CRYPT_AsnEncodeCTL(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret = FALSE; + + __TRY + { + const CTL_INFO *info = (const CTL_INFO *)pvStructInfo; + struct AsnEncodeSequenceItem items[9] = { + { &info->dwVersion, CRYPT_AsnEncodeCTLVersion, 0 }, + { &info->SubjectUsage, CRYPT_AsnEncodeEnhancedKeyUsage, 0 }, + }; + struct AsnConstructedItem constructed = { 0 }; + DWORD cItem = 2; + + if (info->ListIdentifier.cbData) + { + items[cItem].pvStructInfo = &info->ListIdentifier; + items[cItem].encodeFunc = CRYPT_AsnEncodeOctets; + cItem++; + } + if (info->SequenceNumber.cbData) + { + items[cItem].pvStructInfo = &info->SequenceNumber; + items[cItem].encodeFunc = CRYPT_AsnEncodeInteger; + cItem++; + } + items[cItem].pvStructInfo = &info->ThisUpdate; + items[cItem].encodeFunc = CRYPT_AsnEncodeChoiceOfTime; + cItem++; + if (info->NextUpdate.dwLowDateTime || info->NextUpdate.dwHighDateTime) + { + items[cItem].pvStructInfo = &info->NextUpdate; + items[cItem].encodeFunc = CRYPT_AsnEncodeChoiceOfTime; + cItem++; + } + items[cItem].pvStructInfo = &info->SubjectAlgorithm; + items[cItem].encodeFunc = CRYPT_AsnEncodeCTLSubjectAlgorithm; + cItem++; + if (info->cCTLEntry) + { + items[cItem].pvStructInfo = &info->cCTLEntry; + items[cItem].encodeFunc = CRYPT_AsnEncodeCTLEntries; + cItem++; + } + if (info->cExtension) + { + constructed.tag = 0; + constructed.pvStructInfo = &info->cExtension; + constructed.encodeFunc = CRYPT_AsnEncodeExtensions; + items[cItem].pvStructInfo = &constructed; + items[cItem].encodeFunc = CRYPT_AsnEncodeConstructed; + cItem++; + } + ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, cItem, + dwFlags, pEncodePara, pbEncoded, pcbEncoded); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; +} + static BOOL WINAPI CRYPT_AsnEncodeSMIMECapability(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) @@ -1459,29 +1659,32 @@ static BOOL WINAPI CRYPT_AsnEncodeSMIMECapabilities(DWORD dwCertEncodingType, if (ret) dataLen += size; } - CRYPT_EncodeLen(dataLen, NULL, &lenBytes); - bytesNeeded = 1 + lenBytes + dataLen; - if (!pbEncoded) - *pcbEncoded = bytesNeeded; - else + if (ret) { - if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, - pcbEncoded, bytesNeeded))) + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else { - if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) - pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; - for (i = 0; i < capabilities->cCapability; i++) + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, + pbEncoded, pcbEncoded, bytesNeeded))) { - DWORD size = dataLen; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < capabilities->cCapability; i++) + { + DWORD size = dataLen; - ret = CRYPT_AsnEncodeSMIMECapability(dwCertEncodingType, - NULL, &capabilities->rgCapability[i], 0, NULL, pbEncoded, - &size); - pbEncoded += size; - dataLen -= size; + ret = CRYPT_AsnEncodeSMIMECapability(dwCertEncodingType, + NULL, &capabilities->rgCapability[i], 0, NULL, + pbEncoded, &size); + pbEncoded += size; + dataLen -= size; + } } } } @@ -2347,6 +2550,83 @@ static BOOL WINAPI CRYPT_AsnEncodeAuthorityKeyId2(DWORD dwCertEncodingType, return ret; } +static BOOL WINAPI CRYPT_AsnEncodeAccessDescription( + const CERT_ACCESS_DESCRIPTION *descr, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + struct AsnEncodeSequenceItem items[] = { + { descr->pszAccessMethod, CRYPT_AsnEncodeOid, 0 }, + { &descr->AccessLocation, CRYPT_AsnEncodeAltNameEntry, 0 }, + }; + + if (!descr->pszAccessMethod) + { + SetLastError(E_INVALIDARG); + return FALSE; + } + return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, + sizeof(items) / sizeof(items[0]), 0, NULL, pbEncoded, pcbEncoded); +} + +static BOOL WINAPI CRYPT_AsnEncodeAuthorityInfoAccess(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret; + + __TRY + { + DWORD bytesNeeded, dataLen, lenBytes, i; + const CERT_AUTHORITY_INFO_ACCESS *info = + (const CERT_AUTHORITY_INFO_ACCESS *)pvStructInfo; + + ret = TRUE; + for (i = 0, dataLen = 0; ret && i < info->cAccDescr; i++) + { + DWORD size; + + ret = CRYPT_AsnEncodeAccessDescription(&info->rgAccDescr[i], NULL, + &size); + if (ret) + dataLen += size; + } + if (ret) + { + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else + { + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, + pbEncoded, pcbEncoded, bytesNeeded))) + { + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < info->cAccDescr; i++) + { + DWORD size = dataLen; + + ret = CRYPT_AsnEncodeAccessDescription( + &info->rgAccDescr[i], pbEncoded, &size); + pbEncoded += size; + dataLen -= size; + } + } + } + } + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + ret = FALSE; + } + __ENDTRY + return ret; +} + static BOOL WINAPI CRYPT_AsnEncodeBasicConstraints(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) @@ -3762,6 +4042,9 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, case LOWORD(X509_AUTHORITY_KEY_ID2): encodeFunc = CRYPT_AsnEncodeAuthorityKeyId2; break; + case LOWORD(X509_AUTHORITY_INFO_ACCESS): + encodeFunc = CRYPT_AsnEncodeAuthorityInfoAccess; + break; case LOWORD(X509_SEQUENCE_OF_ANY): encodeFunc = CRYPT_AsnEncodeSequenceOfAny; break; @@ -3774,6 +4057,9 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, case LOWORD(X509_ENHANCED_KEY_USAGE): encodeFunc = CRYPT_AsnEncodeEnhancedKeyUsage; break; + case LOWORD(PKCS_CTL): + encodeFunc = CRYPT_AsnEncodeCTL; + break; case LOWORD(PKCS_SMIME_CAPABILITIES): encodeFunc = CRYPT_AsnEncodeSMIMECapabilities; break; @@ -3832,6 +4118,10 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, encodeFunc = CRYPT_AsnEncodeIssuingDistPoint; else if (!strcmp(lpszStructType, szOID_NAME_CONSTRAINTS)) encodeFunc = CRYPT_AsnEncodeNameConstraints; + else if (!strcmp(lpszStructType, szOID_AUTHORITY_INFO_ACCESS)) + encodeFunc = CRYPT_AsnEncodeAuthorityInfoAccess; + else if (!strcmp(lpszStructType, szOID_CTL)) + encodeFunc = CRYPT_AsnEncodeCTL; return encodeFunc; } diff --git a/dlls/crypt32/message.c b/dlls/crypt32/message.c index 2aeb3cfc2d7..9413dd6f2ed 100644 --- a/dlls/crypt32/message.c +++ b/dlls/crypt32/message.c @@ -263,3 +263,58 @@ BOOL WINAPI CryptHashMessage(PCRYPT_HASH_MESSAGE_PARA pHashPara, } return ret; } + +BOOL WINAPI CryptVerifyDetachedMessageHash(PCRYPT_HASH_MESSAGE_PARA pHashPara, + BYTE *pbDetachedHashBlob, DWORD cbDetachedHashBlob, DWORD cToBeHashed, + const BYTE *rgpbToBeHashed[], DWORD rgcbToBeHashed[], BYTE *pbComputedHash, + DWORD *pcbComputedHash) +{ + HCRYPTMSG msg; + BOOL ret = FALSE; + + TRACE("(%p, %p, %d, %d, %p, %p, %p, %p)\n", pHashPara, pbDetachedHashBlob, + cbDetachedHashBlob, cToBeHashed, rgpbToBeHashed, rgcbToBeHashed, + pbComputedHash, pcbComputedHash); + + if (pHashPara->cbSize != sizeof(CRYPT_HASH_MESSAGE_PARA)) + { + SetLastError(E_INVALIDARG); + return FALSE; + } + if (GET_CMSG_ENCODING_TYPE(pHashPara->dwMsgEncodingType) != + PKCS_7_ASN_ENCODING) + { + SetLastError(E_INVALIDARG); + return FALSE; + } + msg = CryptMsgOpenToDecode(pHashPara->dwMsgEncodingType, CMSG_DETACHED_FLAG, + 0, pHashPara->hCryptProv, NULL, NULL); + if (msg) + { + DWORD i; + + ret = CryptMsgUpdate(msg, pbDetachedHashBlob, cbDetachedHashBlob, TRUE); + if (ret) + { + if (cToBeHashed) + { + for (i = 0; ret && i < cToBeHashed; i++) + { + ret = CryptMsgUpdate(msg, rgpbToBeHashed[i], + rgcbToBeHashed[i], i == cToBeHashed - 1 ? TRUE : FALSE); + } + } + else + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + } + if (ret) + { + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + if (ret && pcbComputedHash) + ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, + pbComputedHash, pcbComputedHash); + } + CryptMsgClose(msg); + } + return ret; +} diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index 8ac4b14d57b..449b944a154 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -1607,12 +1607,15 @@ static BOOL CDecodeMsg_DecodeHashedContent(CDecodeMsg *msg, (const BYTE *)digestedData->ContentInfo.pszObjId, digestedData->ContentInfo.pszObjId ? strlen(digestedData->ContentInfo.pszObjId) + 1 : 0); - if (digestedData->ContentInfo.Content.cbData) - CDecodeMsg_DecodeDataContent(msg, - &digestedData->ContentInfo.Content); - else - ContextPropertyList_SetProperty(msg->properties, - CMSG_CONTENT_PARAM, NULL, 0); + if (!(msg->base.open_flags & CMSG_DETACHED_FLAG)) + { + if (digestedData->ContentInfo.Content.cbData) + CDecodeMsg_DecodeDataContent(msg, + &digestedData->ContentInfo.Content); + else + ContextPropertyList_SetProperty(msg->properties, + CMSG_CONTENT_PARAM, NULL, 0); + } ContextPropertyList_SetProperty(msg->properties, CMSG_HASH_DATA_PARAM, digestedData->hash.pbData, digestedData->hash.cbData); LocalFree(digestedData); @@ -1631,54 +1634,7 @@ static BOOL CDecodeMsg_DecodeSignedContent(CDecodeMsg *msg, CRYPT_DECODE_ALLOC_FLAG, NULL, (CRYPT_SIGNED_INFO *)&signedInfo, &size); if (ret) - { - DWORD i; - msg->u.signed_data.info = signedInfo; - ret = CSignedMsgData_AllocateHandles(&msg->u.signed_data); - for (i = 0; ret && i < msg->u.signed_data.info->cSignerInfo; i++) - ret = CSignedMsgData_ConstructSignerHandles(&msg->u.signed_data, i, - msg->crypt_prov); - if (ret) - { - CRYPT_DATA_BLOB *content; - - /* Now that we have all the content, update the hash handles with - * it. If the message is a detached message, the content is stored - * in msg->detached_data rather than in the signed message's - * content. - */ - if (msg->base.open_flags & CMSG_DETACHED_FLAG) - content = &msg->detached_data; - else - content = &msg->u.signed_data.info->content.Content; - if (content->cbData) - { - /* If the message is not detached, have to decode the message's - * content if the type is szOID_RSA_data. - */ - if (!(msg->base.open_flags & CMSG_DETACHED_FLAG) && - !strcmp(msg->u.signed_data.info->content.pszObjId, - szOID_RSA_data)) - { - CRYPT_DATA_BLOB *blob; - - ret = CryptDecodeObjectEx(X509_ASN_ENCODING, - X509_OCTET_STRING, content->pbData, content->cbData, - CRYPT_DECODE_ALLOC_FLAG, NULL, (LPBYTE)&blob, &size); - if (ret) - { - ret = CSignedMsgData_Update(&msg->u.signed_data, - blob->pbData, blob->cbData, TRUE, Verify); - LocalFree(blob); - } - } - else - ret = CSignedMsgData_Update(&msg->u.signed_data, - content->pbData, content->cbData, TRUE, Verify); - } - } - } return ret; } @@ -1743,6 +1699,115 @@ static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob, return ret; } +static BOOL CDecodeMsg_FinalizeHashedContent(CDecodeMsg *msg, + CRYPT_DER_BLOB *blob) +{ + CRYPT_ALGORITHM_IDENTIFIER *hashAlgoID = NULL; + DWORD size = 0; + ALG_ID algID = 0; + BOOL ret; + + CryptMsgGetParam(msg, CMSG_HASH_ALGORITHM_PARAM, 0, NULL, &size); + hashAlgoID = CryptMemAlloc(size); + ret = CryptMsgGetParam(msg, CMSG_HASH_ALGORITHM_PARAM, 0, hashAlgoID, + &size); + if (ret) + algID = CertOIDToAlgId(hashAlgoID->pszObjId); + ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->u.hash); + if (ret) + { + CRYPT_DATA_BLOB content; + + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + { + /* Unlike for non-detached messages, the data were never stored as + * the content param, but were saved in msg->detached_data instead. + * Set the content property with the detached data so the data may + * be hashed. + */ + ContextPropertyList_SetProperty(msg->properties, + CMSG_CONTENT_PARAM, msg->detached_data.pbData, + msg->detached_data.cbData); + } + ret = ContextPropertyList_FindProperty(msg->properties, + CMSG_CONTENT_PARAM, &content); + if (ret) + ret = CryptHashData(msg->u.hash, content.pbData, content.cbData, 0); + } + CryptMemFree(hashAlgoID); + return ret; +} + +static BOOL CDecodeMsg_FinalizeSignedContent(CDecodeMsg *msg, + CRYPT_DER_BLOB *blob) +{ + BOOL ret; + DWORD i, size; + + ret = CSignedMsgData_AllocateHandles(&msg->u.signed_data); + for (i = 0; ret && i < msg->u.signed_data.info->cSignerInfo; i++) + ret = CSignedMsgData_ConstructSignerHandles(&msg->u.signed_data, i, + msg->crypt_prov); + if (ret) + { + CRYPT_DATA_BLOB *content; + + /* Now that we have all the content, update the hash handles with + * it. If the message is a detached message, the content is stored + * in msg->detached_data rather than in the signed message's + * content. + */ + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + content = &msg->detached_data; + else + content = &msg->u.signed_data.info->content.Content; + if (content->cbData) + { + /* If the message is not detached, have to decode the message's + * content if the type is szOID_RSA_data. + */ + if (!(msg->base.open_flags & CMSG_DETACHED_FLAG) && + !strcmp(msg->u.signed_data.info->content.pszObjId, + szOID_RSA_data)) + { + CRYPT_DATA_BLOB *blob; + + ret = CryptDecodeObjectEx(X509_ASN_ENCODING, + X509_OCTET_STRING, content->pbData, content->cbData, + CRYPT_DECODE_ALLOC_FLAG, NULL, (LPBYTE)&blob, &size); + if (ret) + { + ret = CSignedMsgData_Update(&msg->u.signed_data, + blob->pbData, blob->cbData, TRUE, Verify); + LocalFree(blob); + } + } + else + ret = CSignedMsgData_Update(&msg->u.signed_data, + content->pbData, content->cbData, TRUE, Verify); + } + } + return ret; +} + +static BOOL CDecodeMsg_FinalizeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob) +{ + BOOL ret = FALSE; + + switch (msg->type) + { + case CMSG_HASHED: + ret = CDecodeMsg_FinalizeHashedContent(msg, blob); + break; + case CMSG_SIGNED: + ret = CDecodeMsg_FinalizeSignedContent(msg, blob); + break; + default: + ret = TRUE; + } + return ret; +} + static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, BOOL fFinal) { @@ -1815,8 +1880,14 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, } } } - if (ret && msg->base.state == MsgStateFinalized) + if (ret && fFinal && + ((msg->base.open_flags & CMSG_DETACHED_FLAG && msg->base.state == + MsgStateDataFinalized) || + (!(msg->base.open_flags & CMSG_DETACHED_FLAG) && msg->base.state == + MsgStateFinalized))) ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data, msg->type); + if (ret && msg->base.state == MsgStateFinalized) + ret = CDecodeMsg_FinalizeContent(msg, &msg->msg_data); return ret; } @@ -1847,36 +1918,7 @@ static BOOL CDecodeHashMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType, break; } case CMSG_COMPUTED_HASH_PARAM: - if (!msg->u.hash) - { - CRYPT_ALGORITHM_IDENTIFIER *hashAlgoID = NULL; - DWORD size = 0; - ALG_ID algID = 0; - - CryptMsgGetParam(msg, CMSG_HASH_ALGORITHM_PARAM, 0, NULL, &size); - hashAlgoID = CryptMemAlloc(size); - ret = CryptMsgGetParam(msg, CMSG_HASH_ALGORITHM_PARAM, 0, - hashAlgoID, &size); - if (ret) - algID = CertOIDToAlgId(hashAlgoID->pszObjId); - ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->u.hash); - if (ret) - { - CRYPT_DATA_BLOB content; - - ret = ContextPropertyList_FindProperty(msg->properties, - CMSG_CONTENT_PARAM, &content); - if (ret) - ret = CryptHashData(msg->u.hash, content.pbData, - content.cbData, 0); - } - CryptMemFree(hashAlgoID); - } - else - ret = TRUE; - if (ret) - ret = CryptGetHashParam(msg->u.hash, HP_HASHVAL, pvData, pcbData, - 0); + ret = CryptGetHashParam(msg->u.hash, HP_HASHVAL, pvData, pcbData, 0); break; default: { @@ -2452,12 +2494,25 @@ static BOOL CDecodeHashMsg_VerifyHash(CDecodeMsg *msg) ret = CDecodeHashMsg_GetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, computedHash, &computedHashSize); if (ret) - ret = !memcmp(hashBlob.pbData, computedHash, - hashBlob.cbData); + { + if (memcmp(hashBlob.pbData, computedHash, hashBlob.cbData)) + { + SetLastError(CRYPT_E_HASH_VALUE); + ret = FALSE; + } + } CryptMemFree(computedHash); } else + { + SetLastError(ERROR_OUTOFMEMORY); ret = FALSE; + } + } + else + { + SetLastError(CRYPT_E_HASH_VALUE); + ret = FALSE; } } return ret; diff --git a/dlls/crypt32/provstore.c b/dlls/crypt32/provstore.c index b1053ae146e..33f765d633f 100644 --- a/dlls/crypt32/provstore.c +++ b/dlls/crypt32/provstore.c @@ -240,13 +240,13 @@ PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags, ret->provWriteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CRL_FUNC]; else - ret->provWriteCert = NULL; + ret->provWriteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CRL_FUNC) ret->provDeleteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CRL_FUNC]; else - ret->provDeleteCert = NULL; + ret->provDeleteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CONTROL_FUNC) ret->provControl = pProvInfo->rgpvStoreProvFunc[ diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c index d574790f052..7a739a87e96 100644 --- a/dlls/crypt32/str.c +++ b/dlls/crypt32/str.c @@ -181,7 +181,7 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPSTR psz, DWORD csz) { static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG | - CERT_NAME_STR_REVERSE_FLAG | CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; + CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; static const char commaSep[] = ", "; static const char semiSep[] = "; "; static const char crlfSep[] = "\r\n"; @@ -202,6 +202,10 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, { DWORD i, j, sepLen, rdnSepLen; LPCSTR sep, rdnSep; + BOOL reverse = dwStrType & CERT_NAME_STR_REVERSE_FLAG; + const CERT_RDN *rdn = info->rgRDN; + + if(reverse && info->cRDN > 1) rdn += (info->cRDN - 1); if (dwStrType & CERT_NAME_STR_SEMICOLON_FLAG) sep = semiSep; @@ -217,19 +221,19 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, rdnSepLen = strlen(rdnSep); for (i = 0; (!psz || ret < csz) && i < info->cRDN; i++) { - for (j = 0; (!psz || ret < csz) && j < info->rgRDN[i].cRDNAttr; j++) + for (j = 0; (!psz || ret < csz) && j < rdn->cRDNAttr; j++) { DWORD chars; char prefixBuf[10]; /* big enough for GivenName */ LPCSTR prefix = NULL; if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR) - prefix = info->rgRDN[i].rgRDNAttr[j].pszObjId; + prefix = rdn->rgRDNAttr[j].pszObjId; else if ((dwStrType & 0x000000ff) == CERT_X500_NAME_STR) { PCCRYPT_OID_INFO oidInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, - info->rgRDN[i].rgRDNAttr[j].pszObjId, + rdn->rgRDNAttr[j].pszObjId, CRYPT_RDN_ATTR_OID_GROUP_ID); if (oidInfo) @@ -239,7 +243,7 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, prefix = prefixBuf; } else - prefix = info->rgRDN[i].rgRDNAttr[j].pszObjId; + prefix = rdn->rgRDNAttr[j].pszObjId; } if (prefix) { @@ -250,12 +254,12 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, } /* FIXME: handle quoting */ chars = CertRDNValueToStrA( - info->rgRDN[i].rgRDNAttr[j].dwValueType, - &info->rgRDN[i].rgRDNAttr[j].Value, psz ? psz + ret : NULL, + rdn->rgRDNAttr[j].dwValueType, + &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, psz ? csz - ret : 0); if (chars) ret += chars - 1; - if (j < info->rgRDN[i].cRDNAttr - 1) + if (j < rdn->cRDNAttr - 1) { if (psz && ret < csz - rdnSepLen - 1) memcpy(psz + ret, rdnSep, rdnSepLen); @@ -268,6 +272,8 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, memcpy(psz + ret, sep, sepLen); ret += sepLen; } + if(reverse) rdn--; + else rdn++; } LocalFree(info); } @@ -336,7 +342,7 @@ DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz) { static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG | - CERT_NAME_STR_REVERSE_FLAG | CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; + CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; static const WCHAR commaSep[] = { ',',' ',0 }; static const WCHAR semiSep[] = { ';',' ',0 }; static const WCHAR crlfSep[] = { '\r','\n',0 }; @@ -357,6 +363,10 @@ DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, { DWORD i, j, sepLen, rdnSepLen; LPCWSTR sep, rdnSep; + BOOL reverse = dwStrType & CERT_NAME_STR_REVERSE_FLAG; + const CERT_RDN *rdn = info->rgRDN; + + if(reverse && info->cRDN > 1) rdn += (info->cRDN - 1); if (dwStrType & CERT_NAME_STR_SEMICOLON_FLAG) sep = semiSep; @@ -372,25 +382,25 @@ DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, rdnSepLen = lstrlenW(rdnSep); for (i = 0; (!psz || ret < csz) && i < info->cRDN; i++) { - for (j = 0; (!psz || ret < csz) && j < info->rgRDN[i].cRDNAttr; j++) + for (j = 0; (!psz || ret < csz) && j < rdn->cRDNAttr; j++) { DWORD chars; LPCSTR prefixA = NULL; LPCWSTR prefixW = NULL; if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR) - prefixA = info->rgRDN[i].rgRDNAttr[j].pszObjId; + prefixA = rdn->rgRDNAttr[j].pszObjId; else if ((dwStrType & 0x000000ff) == CERT_X500_NAME_STR) { PCCRYPT_OID_INFO oidInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, - info->rgRDN[i].rgRDNAttr[j].pszObjId, + rdn->rgRDNAttr[j].pszObjId, CRYPT_RDN_ATTR_OID_GROUP_ID); if (oidInfo) prefixW = oidInfo->pwszName; else - prefixA = info->rgRDN[i].rgRDNAttr[j].pszObjId; + prefixA = rdn->rgRDNAttr[j].pszObjId; } if (prefixW) { @@ -408,12 +418,12 @@ DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, } /* FIXME: handle quoting */ chars = CertRDNValueToStrW( - info->rgRDN[i].rgRDNAttr[j].dwValueType, - &info->rgRDN[i].rgRDNAttr[j].Value, psz ? psz + ret : NULL, + rdn->rgRDNAttr[j].dwValueType, + &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, psz ? csz - ret : 0); if (chars) ret += chars - 1; - if (j < info->rgRDN[i].cRDNAttr - 1) + if (j < rdn->cRDNAttr - 1) { if (psz && ret < csz - rdnSepLen - 1) memcpy(psz + ret, rdnSep, rdnSepLen * sizeof(WCHAR)); @@ -426,6 +436,8 @@ DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, memcpy(psz + ret, sep, sepLen * sizeof(WCHAR)); ret += sepLen; } + if(reverse) rdn--; + else rdn++; } LocalFree(info); } diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c index 515098aff78..cd0808aa3ae 100644 --- a/dlls/crypt32/tests/cert.c +++ b/dlls/crypt32/tests/cert.c @@ -511,8 +511,10 @@ static void testCertProperties(void) size = 0; ret = CertGetCertificateContextProperty(context, CERT_SIGNATURE_HASH_PROP_ID, NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == CRYPT_E_NOT_FOUND), + "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); /* Test key contexts and handles and such */ size = 0; diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index d6bcf61238f..2b2119c444c 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -4775,6 +4775,733 @@ static void test_decodeAuthorityKeyId2(DWORD dwEncoding) } } +static const BYTE authorityInfoAccessWithUrl[] = { +0x30,0x19,0x30,0x17,0x06,0x02,0x2a,0x03,0x86,0x11,0x68,0x74,0x74,0x70,0x3a, +0x2f,0x2f,0x77,0x69,0x6e,0x65,0x68,0x71,0x2e,0x6f,0x72,0x67 }; +static const BYTE authorityInfoAccessWithUrlAndIPAddr[] = { +0x30,0x29,0x30,0x17,0x06,0x02,0x2a,0x03,0x86,0x11,0x68,0x74,0x74,0x70,0x3a, +0x2f,0x2f,0x77,0x69,0x6e,0x65,0x68,0x71,0x2e,0x6f,0x72,0x67,0x30,0x0e,0x06, +0x02,0x2d,0x06,0x87,0x08,0x30,0x06,0x87,0x04,0x7f,0x00,0x00,0x01 }; + +static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) +{ + static char oid1[] = "1.2.3"; + static char oid2[] = "1.5.6"; + BOOL ret; + BYTE *buf = NULL; + DWORD size = 0; + CERT_ACCESS_DESCRIPTION accessDescription[2]; + CERT_AUTHORITY_INFO_ACCESS aia; + + memset(accessDescription, 0, sizeof(accessDescription)); + aia.cAccDescr = 0; + aia.rgAccDescr = NULL; + /* Having no access descriptions is allowed */ + ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(emptySequence), "unexpected size %d\n", size); + ok(!memcmp(buf, emptySequence, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + /* It can't have an empty access method */ + aia.cAccDescr = 1; + aia.rgAccDescr = accessDescription; + ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + /* It can't have an empty location */ + accessDescription[0].pszAccessMethod = oid1; + SetLastError(0xdeadbeef); + ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + accessDescription[0].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; + accessDescription[0].AccessLocation.pwszURL = (LPWSTR)url; + ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(authorityInfoAccessWithUrl), "unexpected size %d\n", + size); + ok(!memcmp(buf, authorityInfoAccessWithUrl, size), + "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + accessDescription[1].pszAccessMethod = oid2; + accessDescription[1].AccessLocation.dwAltNameChoice = + CERT_ALT_NAME_IP_ADDRESS; + accessDescription[1].AccessLocation.IPAddress.cbData = + sizeof(encodedIPAddr); + accessDescription[1].AccessLocation.IPAddress.pbData = + (LPBYTE)encodedIPAddr; + aia.cAccDescr = 2; + ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(authorityInfoAccessWithUrlAndIPAddr), + "unexpected size %d\n", size); + ok(!memcmp(buf, authorityInfoAccessWithUrlAndIPAddr, size), + "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } +} + +static void compareAuthorityInfoAccess(LPCSTR header, + const CERT_AUTHORITY_INFO_ACCESS *expected, + const CERT_AUTHORITY_INFO_ACCESS *got) +{ + DWORD i; + + ok(expected->cAccDescr == got->cAccDescr, + "%s: expected %d access descriptions, got %d\n", header, + expected->cAccDescr, got->cAccDescr); + for (i = 0; i < expected->cAccDescr; i++) + { + ok(!strcmp(expected->rgAccDescr[i].pszAccessMethod, + got->rgAccDescr[i].pszAccessMethod), "%s[%d]: expected %s, got %s\n", + header, i, expected->rgAccDescr[i].pszAccessMethod, + got->rgAccDescr[i].pszAccessMethod); + compareAltNameEntry(&expected->rgAccDescr[i].AccessLocation, + &got->rgAccDescr[i].AccessLocation); + } +} + +static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) +{ + static char oid1[] = "1.2.3"; + static char oid2[] = "1.5.6"; + BOOL ret; + LPBYTE buf = NULL; + DWORD size = 0; + + ret = CryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, + emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + if (buf) + { + CERT_AUTHORITY_INFO_ACCESS aia = { 0, NULL }; + + compareAuthorityInfoAccess("empty AIA", &aia, + (CERT_AUTHORITY_INFO_ACCESS *)buf); + LocalFree(buf); + buf = NULL; + } + ret = CryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, + authorityInfoAccessWithUrl, sizeof(authorityInfoAccessWithUrl), + CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + if (buf) + { + CERT_ACCESS_DESCRIPTION accessDescription; + CERT_AUTHORITY_INFO_ACCESS aia; + + accessDescription.pszAccessMethod = oid1; + accessDescription.AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; + accessDescription.AccessLocation.pwszURL = (LPWSTR)url; + aia.cAccDescr = 1; + aia.rgAccDescr = &accessDescription; + compareAuthorityInfoAccess("AIA with URL", &aia, + (CERT_AUTHORITY_INFO_ACCESS *)buf); + LocalFree(buf); + buf = NULL; + } + ret = CryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, + authorityInfoAccessWithUrlAndIPAddr, + sizeof(authorityInfoAccessWithUrlAndIPAddr), CRYPT_DECODE_ALLOC_FLAG, + NULL, (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + if (buf) + { + CERT_ACCESS_DESCRIPTION accessDescription[2]; + CERT_AUTHORITY_INFO_ACCESS aia; + + accessDescription[0].pszAccessMethod = oid1; + accessDescription[0].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; + accessDescription[0].AccessLocation.pwszURL = (LPWSTR)url; + accessDescription[1].pszAccessMethod = oid2; + accessDescription[1].AccessLocation.dwAltNameChoice = + CERT_ALT_NAME_IP_ADDRESS; + accessDescription[1].AccessLocation.IPAddress.cbData = + sizeof(encodedIPAddr); + accessDescription[1].AccessLocation.IPAddress.pbData = + (LPBYTE)encodedIPAddr; + aia.cAccDescr = 2; + aia.rgAccDescr = accessDescription; + compareAuthorityInfoAccess("AIA with URL and IP addr", &aia, + (CERT_AUTHORITY_INFO_ACCESS *)buf); + LocalFree(buf); + buf = NULL; + } +} + +static const BYTE emptyCTL[] = { +0x30,0x17,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE emptyCTLWithVersion1[] = { +0x30,0x1a,0x02,0x01,0x01,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31, +0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithUsageIdentifier[] = { +0x30,0x1b,0x30,0x04,0x06,0x02,0x2a,0x03,0x18,0x0f,0x31,0x36,0x30,0x31,0x30, +0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithListIdentifier[] = { +0x30,0x1a,0x30,0x00,0x04,0x01,0x01,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31, +0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithSequenceNumber[] = { +0x30,0x1a,0x30,0x00,0x02,0x01,0x01,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31, +0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithThisUpdate[] = { +0x30,0x15,0x30,0x00,0x17,0x0d,0x30,0x35,0x30,0x36,0x30,0x36,0x31,0x36,0x31, +0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithThisAndNextUpdate[] = { +0x30,0x24,0x30,0x00,0x17,0x0d,0x30,0x35,0x30,0x36,0x30,0x36,0x31,0x36,0x31, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x35,0x30,0x36,0x30,0x36,0x31,0x36,0x31, +0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithAlgId[] = { +0x30,0x1b,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x06,0x06,0x02,0x2d,0x06,0x05,0x00 }; +static const BYTE ctlWithBogusEntry[] = { +0x30,0x29,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x30,0x10,0x30,0x0e,0x04, +0x01,0x01,0x31,0x09,0x30,0x07,0x06,0x02,0x2a,0x03,0x31,0x01,0x01 }; +static const BYTE ctlWithOneEntry[] = { +0x30,0x2a,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x30,0x11,0x30,0x0f,0x04, +0x01,0x01,0x31,0x0a,0x30,0x08,0x06,0x02,0x2a,0x03,0x31,0x02,0x30,0x00 }; +static const BYTE ctlWithTwoEntries[] = { +0x30,0x41,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x30,0x28,0x30,0x0f,0x04, +0x01,0x01,0x31,0x0a,0x30,0x08,0x06,0x02,0x2a,0x03,0x31,0x02,0x30,0x00,0x30, +0x15,0x04,0x01,0x01,0x31,0x10,0x30,0x0e,0x06,0x02,0x2d,0x06,0x31,0x08,0x30, +0x06,0x87,0x04,0x7f,0x00,0x00,0x01 }; + +static void test_encodeCTL(DWORD dwEncoding) +{ + static char oid1[] = "1.2.3"; + static char oid2[] = "1.5.6"; + char *pOid1 = oid1; + BOOL ret; + BYTE *buf = NULL; + DWORD size = 0; + CTL_INFO info; + SYSTEMTIME thisUpdate = { 2005, 6, 1, 6, 16, 10, 0, 0 }; + CTL_ENTRY ctlEntry[2]; + CRYPT_ATTRIBUTE attr1, attr2; + CRYPT_ATTR_BLOB value1, value2; + + memset(&info, 0, sizeof(info)); + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(emptyCTL), "unexpected size %d\n", size); + ok(!memcmp(buf, emptyCTL, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.dwVersion = 1; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(emptyCTLWithVersion1), "unexpected size %d\n", size); + ok(!memcmp(buf, emptyCTLWithVersion1, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.dwVersion = 0; + info.SubjectUsage.cUsageIdentifier = 1; + info.SubjectUsage.rgpszUsageIdentifier = &pOid1; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithUsageIdentifier), "unexpected size %d\n", + size); + ok(!memcmp(buf, ctlWithUsageIdentifier, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.SubjectUsage.cUsageIdentifier = 0; + info.ListIdentifier.cbData = sizeof(serialNum); + info.ListIdentifier.pbData = (LPBYTE)serialNum; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithListIdentifier), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithListIdentifier, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.ListIdentifier.cbData = 0; + info.SequenceNumber.cbData = sizeof(serialNum); + info.SequenceNumber.pbData = (LPBYTE)serialNum; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithSequenceNumber), "unexpected size %d\n", + size); + ok(!memcmp(buf, ctlWithSequenceNumber, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.SequenceNumber.cbData = 0; + SystemTimeToFileTime(&thisUpdate, &info.ThisUpdate); + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithThisUpdate), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithThisUpdate, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + SystemTimeToFileTime(&thisUpdate, &info.NextUpdate); + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithThisAndNextUpdate), "unexpected size %d\n", + size); + ok(!memcmp(buf, ctlWithThisAndNextUpdate, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + info.ThisUpdate.dwLowDateTime = info.ThisUpdate.dwHighDateTime = 0; + info.NextUpdate.dwLowDateTime = info.NextUpdate.dwHighDateTime = 0; + info.SubjectAlgorithm.pszObjId = oid2; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithAlgId), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithAlgId, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + /* The value is supposed to be asn.1 encoded, so this'll fail to decode + * (see tests below) but it'll encode fine. + */ + info.SubjectAlgorithm.pszObjId = NULL; + value1.cbData = sizeof(serialNum); + value1.pbData = (LPBYTE)serialNum; + attr1.pszObjId = oid1; + attr1.cValue = 1; + attr1.rgValue = &value1; + ctlEntry[0].SubjectIdentifier.cbData = sizeof(serialNum); + ctlEntry[0].SubjectIdentifier.pbData = (LPBYTE)serialNum; + ctlEntry[0].cAttribute = 1; + ctlEntry[0].rgAttribute = &attr1; + info.cCTLEntry = 1; + info.rgCTLEntry = ctlEntry; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithBogusEntry), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithBogusEntry, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + value1.cbData = sizeof(emptySequence); + value1.pbData = (LPBYTE)emptySequence; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithOneEntry), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithOneEntry, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } + value2.cbData = sizeof(encodedIPAddr); + value2.pbData = (LPBYTE)encodedIPAddr; + attr2.pszObjId = oid2; + attr2.cValue = 1; + attr2.rgValue = &value2; + ctlEntry[1].SubjectIdentifier.cbData = sizeof(serialNum); + ctlEntry[1].SubjectIdentifier.pbData = (LPBYTE)serialNum; + ctlEntry[1].cAttribute = 1; + ctlEntry[1].rgAttribute = &attr2; + info.cCTLEntry = 2; + ret = CryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, + CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + ok(size == sizeof(ctlWithTwoEntries), "unexpected size %d\n", size); + ok(!memcmp(buf, ctlWithTwoEntries, size), "unexpected value\n"); + LocalFree(buf); + buf = NULL; + } +} + +static void compareCTLInfo(LPCSTR header, const CTL_INFO *expected, + const CTL_INFO *got) +{ + DWORD i, j, k; + + ok(expected->dwVersion == got->dwVersion, + "%s: expected version %d, got %d\n", header, expected->dwVersion, + got->dwVersion); + ok(expected->SubjectUsage.cUsageIdentifier == + got->SubjectUsage.cUsageIdentifier, + "%s: expected %d usage identifiers, got %d\n", header, + expected->SubjectUsage.cUsageIdentifier, + got->SubjectUsage.cUsageIdentifier); + for (i = 0; i < expected->SubjectUsage.cUsageIdentifier; i++) + ok(!strcmp(expected->SubjectUsage.rgpszUsageIdentifier[i], + got->SubjectUsage.rgpszUsageIdentifier[i]), + "%s[%d]: expected %s, got %s\n", header, i, + expected->SubjectUsage.rgpszUsageIdentifier[i], + got->SubjectUsage.rgpszUsageIdentifier[i]); + ok(expected->ListIdentifier.cbData == got->ListIdentifier.cbData, + "%s: expected list identifier of %d bytes, got %d\n", header, + expected->ListIdentifier.cbData, got->ListIdentifier.cbData); + if (expected->ListIdentifier.cbData) + ok(!memcmp(expected->ListIdentifier.pbData, got->ListIdentifier.pbData, + expected->ListIdentifier.cbData), + "%s: unexpected list identifier value\n", header); + ok(expected->SequenceNumber.cbData == got->SequenceNumber.cbData, + "%s: expected sequence number of %d bytes, got %d\n", header, + expected->SequenceNumber.cbData, got->SequenceNumber.cbData); + if (expected->SequenceNumber.cbData) + ok(!memcmp(expected->SequenceNumber.pbData, got->SequenceNumber.pbData, + expected->SequenceNumber.cbData), + "%s: unexpected sequence number value\n", header); + ok(!memcmp(&expected->ThisUpdate, &got->ThisUpdate, sizeof(FILETIME)), + "%s: expected this update = (%d, %d), got (%d, %d)\n", header, + expected->ThisUpdate.dwLowDateTime, expected->ThisUpdate.dwHighDateTime, + got->ThisUpdate.dwLowDateTime, got->ThisUpdate.dwHighDateTime); + ok(!memcmp(&expected->NextUpdate, &got->NextUpdate, sizeof(FILETIME)), + "%s: expected next update = (%d, %d), got (%d, %d)\n", header, + expected->NextUpdate.dwLowDateTime, expected->NextUpdate.dwHighDateTime, + got->NextUpdate.dwLowDateTime, got->NextUpdate.dwHighDateTime); + if (expected->SubjectAlgorithm.pszObjId && + *expected->SubjectAlgorithm.pszObjId && !got->SubjectAlgorithm.pszObjId) + ok(0, "%s: expected subject algorithm %s, got NULL\n", header, + expected->SubjectAlgorithm.pszObjId); + if (expected->SubjectAlgorithm.pszObjId && got->SubjectAlgorithm.pszObjId) + ok(!strcmp(expected->SubjectAlgorithm.pszObjId, + got->SubjectAlgorithm.pszObjId), + "%s: expected subject algorithm %s, got %s\n", header, + expected->SubjectAlgorithm.pszObjId, got->SubjectAlgorithm.pszObjId); + ok(expected->SubjectAlgorithm.Parameters.cbData == + got->SubjectAlgorithm.Parameters.cbData, + "%s: expected subject algorithm parameters of %d bytes, got %d\n", header, + expected->SubjectAlgorithm.Parameters.cbData, + got->SubjectAlgorithm.Parameters.cbData); + if (expected->SubjectAlgorithm.Parameters.cbData) + ok(!memcmp(expected->SubjectAlgorithm.Parameters.pbData, + got->SubjectAlgorithm.Parameters.pbData, + expected->SubjectAlgorithm.Parameters.cbData), + "%s: unexpected subject algorithm parameter value\n", header); + ok(expected->cCTLEntry == got->cCTLEntry, + "%s: expected %d CTL entries, got %d\n", header, expected->cCTLEntry, + got->cCTLEntry); + for (i = 0; i < expected->cCTLEntry; i++) + { + ok(expected->rgCTLEntry[i].SubjectIdentifier.cbData == + got->rgCTLEntry[i].SubjectIdentifier.cbData, + "%s[%d]: expected subject identifier of %d bytes, got %d\n", + header, i, expected->rgCTLEntry[i].SubjectIdentifier.cbData, + got->rgCTLEntry[i].SubjectIdentifier.cbData); + if (expected->rgCTLEntry[i].SubjectIdentifier.cbData) + ok(!memcmp(expected->rgCTLEntry[i].SubjectIdentifier.pbData, + got->rgCTLEntry[i].SubjectIdentifier.pbData, + expected->rgCTLEntry[i].SubjectIdentifier.cbData), + "%s[%d]: unexpected subject identifier value\n", + header, i); + for (j = 0; j < expected->rgCTLEntry[i].cAttribute; j++) + { + ok(!strcmp(expected->rgCTLEntry[i].rgAttribute[j].pszObjId, + got->rgCTLEntry[i].rgAttribute[j].pszObjId), + "%s[%d][%d]: expected attribute OID %s, got %s\n", header, i, j, + expected->rgCTLEntry[i].rgAttribute[j].pszObjId, + got->rgCTLEntry[i].rgAttribute[j].pszObjId); + for (k = 0; k < expected->rgCTLEntry[i].rgAttribute[j].cValue; k++) + { + ok(expected->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData == + got->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData, + "%s[%d][%d][%d]: expected value of %d bytes, got %d\n", + header, i, j, k, + expected->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData, + got->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData); + if (expected->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData) + ok(!memcmp( + expected->rgCTLEntry[i].rgAttribute[j].rgValue[k].pbData, + got->rgCTLEntry[i].rgAttribute[j].rgValue[k].pbData, + expected->rgCTLEntry[i].rgAttribute[j].rgValue[k].cbData), + "%s[%d][%d][%d]: unexpected value\n", + header, i, j, k); + } + } + } + ok(expected->cExtension == got->cExtension, + "%s: expected %d extensions, got %d\n", header, expected->cExtension, + got->cExtension); + for (i = 0; i < expected->cExtension; i++) + { + ok(!strcmp(expected->rgExtension[i].pszObjId, + got->rgExtension[i].pszObjId), "%s[%d]: expected %s, got %s\n", + header, i, expected->rgExtension[i].pszObjId, + got->rgExtension[i].pszObjId); + ok(expected->rgExtension[i].fCritical == got->rgExtension[i].fCritical, + "%s[%d]: expected fCritical = %d, got %d\n", header, i, + expected->rgExtension[i].fCritical, got->rgExtension[i].fCritical); + ok(expected->rgExtension[i].Value.cbData == + got->rgExtension[i].Value.cbData, + "%s[%d]: expected extension value to have %d bytes, got %d\n", + header, i, expected->rgExtension[i].Value.cbData, + got->rgExtension[i].Value.cbData); + if (expected->rgExtension[i].Value.cbData) + ok(!memcmp(expected->rgExtension[i].Value.pbData, + got->rgExtension[i].Value.pbData, + expected->rgExtension[i].Value.cbData), + "%s[%d]: unexpected extension value\n", header, i); + } +} + +static const BYTE signedCTL[] = { +0x30,0x81,0xc7,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xb9,0x30,0x81,0xb6,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x28,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x1b,0x04,0x19,0x30,0x17,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x02,0x06,0x00,0x31,0x77,0x30,0x75,0x02,0x01,0x01,0x30,0x1a, +0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, +0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x04,0x06,0x00,0x05, +0x00,0x04,0x40,0xca,0xd8,0x32,0xd1,0xbd,0x97,0x61,0x54,0xd6,0x80,0xcf,0x0d, +0xbd,0xa2,0x42,0xc7,0xca,0x37,0x91,0x7d,0x9d,0xac,0x8c,0xdf,0x05,0x8a,0x39, +0xc6,0x07,0xc1,0x37,0xe6,0xb9,0xd1,0x0d,0x26,0xec,0xa5,0xb0,0x8a,0x51,0x26, +0x2b,0x4f,0x73,0x44,0x86,0x83,0x5e,0x2b,0x6e,0xcc,0xf8,0x1b,0x85,0x53,0xe9, +0x7a,0x80,0x8f,0x6b,0x42,0x19,0x93 }; +static const BYTE signedCTLWithCTLInnerContent[] = { +0x30,0x82,0x01,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x00,0x30,0x81,0xfd,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06, +0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x30,0x06,0x09, +0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x23,0x30,0x21,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05, +0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02,0x01,0x01,0x30,0x1a,0x30,0x15,0x31, +0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20, +0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0,0x3b,0x30,0x18,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0b,0x06,0x09,0x2b,0x06,0x01,0x04, +0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x01,0x09,0x04,0x31,0x12,0x04,0x10,0x54,0x71,0xbc,0xe1,0x56,0x31,0xa2,0xf9, +0x65,0x70,0x34,0xf8,0xe2,0xe9,0xb4,0xf4,0x30,0x04,0x06,0x00,0x05,0x00,0x04, +0x40,0x2f,0x1b,0x9f,0x5a,0x4a,0x15,0x73,0xfa,0xb1,0x93,0x3d,0x09,0x52,0xdf, +0x6b,0x98,0x4b,0x13,0x5e,0xe7,0xbf,0x65,0xf4,0x9c,0xc2,0xb1,0x77,0x09,0xb1, +0x66,0x4d,0x72,0x0d,0xb1,0x1a,0x50,0x20,0xe0,0x57,0xa2,0x39,0xc7,0xcd,0x7f, +0x8e,0xe7,0x5f,0x76,0x2b,0xd1,0x6a,0x82,0xb3,0x30,0x25,0x61,0xf6,0x25,0x23, +0x57,0x6c,0x0b,0x47,0xb8 }; + +static void test_decodeCTL(DWORD dwEncoding) +{ + static char oid1[] = "1.2.3"; + static char oid2[] = "1.5.6"; + static BYTE nullData[] = { 5,0 }; + char *pOid1 = oid1; + BOOL ret; + BYTE *buf = NULL; + DWORD size = 0; + CTL_INFO info; + SYSTEMTIME thisUpdate = { 2005, 6, 1, 6, 16, 10, 0, 0 }; + CTL_ENTRY ctlEntry[2]; + CRYPT_ATTRIBUTE attr1, attr2; + CRYPT_ATTR_BLOB value1, value2; + + memset(&info, 0, sizeof(info)); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, emptyCTL, sizeof(emptyCTL), + CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("empty CTL", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.dwVersion = 1; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, emptyCTLWithVersion1, + sizeof(emptyCTLWithVersion1), CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, + &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("v1 CTL", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.dwVersion = 0; + info.SubjectUsage.cUsageIdentifier = 1; + info.SubjectUsage.rgpszUsageIdentifier = &pOid1; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithUsageIdentifier, + sizeof(ctlWithUsageIdentifier), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with usage identifier", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.SubjectUsage.cUsageIdentifier = 0; + info.ListIdentifier.cbData = sizeof(serialNum); + info.ListIdentifier.pbData = (LPBYTE)serialNum; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithListIdentifier, + sizeof(ctlWithListIdentifier), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with list identifier", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.ListIdentifier.cbData = 0; + info.SequenceNumber.cbData = sizeof(serialNum); + info.SequenceNumber.pbData = (LPBYTE)serialNum; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithSequenceNumber, + sizeof(ctlWithSequenceNumber), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with sequence number", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.SequenceNumber.cbData = 0; + SystemTimeToFileTime(&thisUpdate, &info.ThisUpdate); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithThisUpdate, + sizeof(ctlWithThisUpdate), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with this update", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + SystemTimeToFileTime(&thisUpdate, &info.NextUpdate); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithThisAndNextUpdate, + sizeof(ctlWithThisAndNextUpdate), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with this and next update", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + info.ThisUpdate.dwLowDateTime = info.ThisUpdate.dwHighDateTime = 0; + info.NextUpdate.dwLowDateTime = info.NextUpdate.dwHighDateTime = 0; + info.SubjectAlgorithm.pszObjId = oid2; + info.SubjectAlgorithm.Parameters.cbData = sizeof(nullData); + info.SubjectAlgorithm.Parameters.pbData = nullData; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithAlgId, + sizeof(ctlWithAlgId), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with algorithm identifier", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + SetLastError(0xdeadbeef); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithBogusEntry, + sizeof(ctlWithBogusEntry), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || CRYPT_E_ASN1_CORRUPT), + "expected CRYPT_E_ASN1_EOD or CRYPT_E_ASN1_CORRUPT, got %08x\n", + GetLastError()); + info.SubjectAlgorithm.Parameters.cbData = 0; + info.ThisUpdate.dwLowDateTime = info.ThisUpdate.dwHighDateTime = 0; + info.NextUpdate.dwLowDateTime = info.NextUpdate.dwHighDateTime = 0; + info.SubjectAlgorithm.pszObjId = oid2; + info.SubjectAlgorithm.pszObjId = NULL; + value1.cbData = sizeof(emptySequence); + value1.pbData = (LPBYTE)emptySequence; + attr1.pszObjId = oid1; + attr1.cValue = 1; + attr1.rgValue = &value1; + ctlEntry[0].SubjectIdentifier.cbData = sizeof(serialNum); + ctlEntry[0].SubjectIdentifier.pbData = (LPBYTE)serialNum; + ctlEntry[0].cAttribute = 1; + ctlEntry[0].rgAttribute = &attr1; + info.cCTLEntry = 1; + info.rgCTLEntry = ctlEntry; + SetLastError(0xdeadbeef); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithOneEntry, + sizeof(ctlWithOneEntry), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with one entry", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + value2.cbData = sizeof(encodedIPAddr); + value2.pbData = (LPBYTE)encodedIPAddr; + attr2.pszObjId = oid2; + attr2.cValue = 1; + attr2.rgValue = &value2; + ctlEntry[1].SubjectIdentifier.cbData = sizeof(serialNum); + ctlEntry[1].SubjectIdentifier.pbData = (LPBYTE)serialNum; + ctlEntry[1].cAttribute = 1; + ctlEntry[1].rgAttribute = &attr2; + info.cCTLEntry = 2; + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithTwoEntries, + sizeof(ctlWithTwoEntries), CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + if (buf) + { + compareCTLInfo("CTL with two entries", &info, (CTL_INFO *)buf); + LocalFree(buf); + buf = NULL; + } + /* A signed CTL isn't decodable, even if the inner content is a CTL */ + SetLastError(0xdeadbeef); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, signedCTL, + sizeof(signedCTL), CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, + "expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptDecodeObjectEx(dwEncoding, PKCS_CTL, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), + CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); + ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, + "expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); +} + static const BYTE emptyPKCSContentInfo[] = { 0x30,0x04,0x06,0x02,0x2a,0x03 }; static const BYTE emptyPKCSContentInfoExtraBytes[] = { 0x30,0x04,0x06,0x02,0x2a, 0x03,0,0,0,0,0,0 }; @@ -5660,8 +6387,9 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %08x\n", GetLastError()); + ok(!ret, "Expected failure, got %d\n", ret); + ok(GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08x\n", GetLastError()); /* To be encoded, a signer must have a valid cert ID, where a valid ID may * be a key id or a issuer serial number with at least the issuer set, and * the encoding must include PKCS_7_ASN_ENCODING. @@ -6433,6 +7161,10 @@ START_TEST(encode) test_decodeAuthorityKeyId(encodings[i]); test_encodeAuthorityKeyId2(encodings[i]); test_decodeAuthorityKeyId2(encodings[i]); + test_encodeAuthorityInfoAccess(encodings[i]); + test_decodeAuthorityInfoAccess(encodings[i]); + test_encodeCTL(encodings[i]); + test_decodeCTL(encodings[i]); test_encodePKCSContentInfo(encodings[i]); test_decodePKCSContentInfo(encodings[i]); test_encodePKCSAttribute(encodings[i]); diff --git a/dlls/crypt32/tests/message.c b/dlls/crypt32/tests/message.c index 11b8c1c1fce..1072185ab90 100644 --- a/dlls/crypt32/tests/message.c +++ b/dlls/crypt32/tests/message.c @@ -84,6 +84,103 @@ static void test_msg_get_signer_count(void) ok(count == 1, "Expected 1, got %d\n", count); } +static BYTE detachedHashContent[] = { +0x30,0x3f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x05,0xa0,0x32, +0x30,0x30,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x07,0x01,0x04,0x10,0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb, +0x9d,0x2a,0x8f,0x26,0x2f }; +static const BYTE msgData[] = { 1, 2, 3, 4 }; + +static void test_verify_detached_message_hash(void) +{ + BOOL ret; + CRYPT_HASH_MESSAGE_PARA para; + DWORD size, hashSize; + const BYTE *pMsgData = msgData; + BYTE hash[16]; + + if (0) + { + ret = CryptVerifyDetachedMessageHash(NULL, NULL, 0, 0, NULL, NULL, NULL, + NULL); + } + memset(¶, 0, sizeof(para)); + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, + NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + para.cbSize = sizeof(para); + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, + NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, + NULL); + ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); + para.dwMsgEncodingType = X509_ASN_ENCODING; + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, + NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, + NULL); + ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); + /* Curiously, passing no data to hash succeeds.. */ + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 0, NULL, NULL, NULL, NULL); + todo_wine + ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); + /* as does passing the actual content of the message to hash.. */ + size = sizeof(msgData); + pMsgData = msgData; + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL); + ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); + /* while passing data to hash that isn't the content of the message fails. + */ + size = sizeof(detachedHashContent); + pMsgData = detachedHashContent; + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, NULL); + ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE, + "expected CRYPT_E_HASH_VALUE, got %08x\n", GetLastError()); + /* Getting the size of the hash while passing no hash data causes the + * hash to be checked (and fail.) + */ + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 0, NULL, NULL, NULL, &hashSize); + ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE, + "expected CRYPT_E_HASH_VALUE, got %08x\n", GetLastError()); + size = sizeof(msgData); + pMsgData = msgData; + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 1, &pMsgData, &size, NULL, &hashSize); + ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); + ok(hashSize == sizeof(hash), "unexpected size %d\n", hashSize); + hashSize = 1; + SetLastError(0xdeadbeef); + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize); + ok(!ret && GetLastError() == ERROR_MORE_DATA, + "expected ERROR_MORE_DATA, got %08x\n", GetLastError()); + hashSize = sizeof(hash); + ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, + sizeof(detachedHashContent), 1, &pMsgData, &size, hash, &hashSize); + ok(ret, "CryptVerifyDetachedMessageHash failed: %08x\n", GetLastError()); +} + static const BYTE signedContent[] = { 0x30,0x81,0xb2,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, 0x81,0xa4,0x30,0x81,0xa1,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, @@ -317,9 +414,11 @@ static void test_hash_message(void) SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, FALSE, 2, toHash, hashSize, NULL, &hashedBlobSize, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_UNKNOWN_ALGO, - "expected CRYPT_E_UNKNOWN_ALGO, got 0x%08x (%d)\n", GetLastError(), - GetLastError()); + ok(!ret && + (GetLastError() == CRYPT_E_UNKNOWN_ALGO || + GetLastError() == CRYPT_E_OID_FORMAT), /* Vista */ + "expected CRYPT_E_UNKNOWN_ALGO or CRYPT_E_OID_FORMAT, got 0x%08x (%d)\n", + GetLastError(), GetLastError()); para.HashAlgorithm.pszObjId = oid_rsa_md5; /* With a valid hash algorithm, this succeeds, even though fDetached is * FALSE. @@ -404,6 +503,7 @@ static void test_hash_message(void) START_TEST(message) { test_msg_get_signer_count(); + test_verify_detached_message_hash(); test_verify_message_signature(); test_hash_message(); } diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index ba35b891311..aa969e1251a 100644 --- a/dlls/crypt32/tests/msg.c +++ b/dlls/crypt32/tests/msg.c @@ -2241,6 +2241,21 @@ static void test_decode_msg_update(void) ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, 0, NULL, &streamInfo); + ret = CryptMsgUpdate(msg, detachedSignedContent, sizeof(detachedSignedContent), FALSE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, detachedSignedContent, sizeof(detachedSignedContent), FALSE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + + ret = CryptMsgUpdate(msg, detachedSignedContent, sizeof(detachedSignedContent), TRUE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + CryptMsgClose(msg); } static const BYTE hashParam[] = { 0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1, @@ -2660,7 +2675,6 @@ static void test_msg_control(void) TRUE); /* Oddly enough, this fails */ ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); - todo_wine ok(!ret, "Expected failure\n"); CryptMsgClose(msg); msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, @@ -2675,6 +2689,51 @@ static void test_msg_control(void) "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); CryptMsgClose(msg); + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, 0, + NULL, NULL); + /* Can't verify the hash of a detached message before it's been updated. */ + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, + "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, detachedHashContent, sizeof(detachedHashContent), + TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + /* Still can't verify the hash of a detached message with the content + * of the detached hash given.. + */ + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + ok(!ret && GetLastError() == CRYPT_E_HASH_VALUE, + "Expected CRYPT_E_HASH_VALUE, got %08x\n", GetLastError()); + /* and giving the content of the message after attempting to verify the + * hash fails. + */ + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + todo_wine + ok(!ret && GetLastError() == NTE_BAD_HASH_STATE, + "Expected NTE_BAD_HASH_STATE, got %08x\n", GetLastError()); + CryptMsgClose(msg); + + /* Finally, verifying the hash of a detached message in the correct order: + * 1. Update with the detached hash message + * 2. Update with the content of the message + * 3. Verifying the hash of the message + * succeeds. + */ + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, 0, + NULL, NULL); + ret = CryptMsgUpdate(msg, detachedHashContent, sizeof(detachedHashContent), + TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + ok(ret, "CryptMsgControl failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL, NULL); /* Can't verify the hash of a signed message */ diff --git a/dlls/crypt32/tests/oid.c b/dlls/crypt32/tests/oid.c index 0ec6c298caa..a583fc718fc 100644 --- a/dlls/crypt32/tests/oid.c +++ b/dlls/crypt32/tests/oid.c @@ -102,9 +102,10 @@ static void testOIDToAlgID(void) ok(!alg, "Expected failure, got %d\n", alg); ok(GetLastError() == 0xdeadbeef || GetLastError() == ERROR_RESOURCE_NAME_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER || /* Vista */ GetLastError() == ERROR_SUCCESS, /* win2k */ - "Expected ERROR_RESOURCE_NAME_NOT_FOUND, ERROR_SUCCESS " - "or no error set, got %08x\n", GetLastError()); + "Expected ERROR_RESOURCE_NAME_NOT_FOUND, ERROR_INVALID_PARAMETER, " + "ERROR_SUCCESS or no error set, got %08x\n", GetLastError()); for (i = 0; i < sizeof(oidToAlgID) / sizeof(oidToAlgID[0]); i++) { diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c index e4cdb77a3aa..5b2e0253e95 100644 --- a/dlls/crypt32/tests/str.c +++ b/dlls/crypt32/tests/str.c @@ -119,6 +119,7 @@ static char subjectStrSemicolon[] = static char subjectStrCRLF[] = "2.5.4.6=US\r\n2.5.4.8=Minnesota\r\n2.5.4.7=Minneapolis\r\n2.5.4.10=CodeWeavers\r\n2.5.4.11=Wine Development\r\n2.5.4.3=localhost\r\n1.2.840.113549.1.9.1=aric@codeweavers.com"; static char x500SubjectStr[] = "C=US, S=Minnesota, L=Minneapolis, O=CodeWeavers, OU=Wine Development, CN=localhost, E=aric@codeweavers.com"; +static char x500SubjectStrSemicolonReverse[] = "E=aric@codeweavers.com; CN=localhost; OU=Wine Development; O=CodeWeavers; L=Minneapolis; S=Minnesota; C=US"; static WCHAR issuerStrW[] = { 'U','S',',',' ','M','i','n','n','e','s','o','t','a',',',' ','M','i','n','n', 'e','a','p','o','l','i','s',',',' ','C','o','d','e','W','e','a','v','e','r', @@ -167,6 +168,13 @@ static WCHAR subjectStrCRLFW[] = { 'h','o','s','t','\r','\n','1','.','2','.','8','4','0','.','1','1','3','5','4', '9','.','1','.','9','.','1','=','a','r','i','c','@','c','o','d','e','w','e', 'a','v','e','r','s','.','c','o','m',0 }; +static WCHAR x500SubjectStrSemicolonReverseW[] = { + 'E','=','a','r','i','c','@','c','o','d','e','w','e','a','v','e','r','s','.','c', + 'o','m',';',' ','C','N','=','l','o','c','a','l','h','o','s','t',';',' ','O','U', + '=','W','i','n','e',' ','D','e','v','e','l','o','p','m','e','n','t',';',' ','O', + '=','C','o','d','e','W','e','a','v','e','r','s',';',' ','L','=','M','i','n','n', + 'e','a','p','o','l','i','s',';',' ','S','=','M','i','n','n','e','s','o','t','a', + ';',' ','C','=','U','S',0 }; typedef BOOL (WINAPI *CryptDecodeObjectFunc)(DWORD, LPCSTR, const BYTE *, DWORD, DWORD, void *, DWORD *); @@ -371,6 +379,8 @@ static void test_CertNameToStrA(void) subjectStrCRLF); test_NameToStrConversionA(&context->pCertInfo->Subject, CERT_X500_NAME_STR, x500SubjectStr); + test_NameToStrConversionA(&context->pCertInfo->Subject, + CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, x500SubjectStrSemicolonReverse); CertFreeCertificateContext(context); } @@ -446,6 +456,8 @@ static void test_CertNameToStrW(void) test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, subjectStrCRLFW); + test_NameToStrConversionW(&context->pCertInfo->Subject, + CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, x500SubjectStrSemicolonReverseW); CertFreeCertificateContext(context); } diff --git a/dlls/cryptdlg/cryptdlg.spec b/dlls/cryptdlg/cryptdlg.spec index 65569440980..1536b101a39 100644 --- a/dlls/cryptdlg/cryptdlg.spec +++ b/dlls/cryptdlg/cryptdlg.spec @@ -13,8 +13,8 @@ 13 stub CertModifyCertificatesToTrust 14 stub CertSelectCertificateA 15 stub CertSelectCertificateW -16 stub CertViewPropertiesA -17 stub CertViewPropertiesW +16 stdcall CertViewPropertiesA(ptr) +17 stdcall CertViewPropertiesW(ptr) 18 stdcall -private DllRegisterServer() 19 stdcall -private DllUnregisterServer() 20 stdcall GetFriendlyNameOfCertA(ptr ptr long) diff --git a/dlls/cryptdlg/main.c b/dlls/cryptdlg/main.c index 316d83e4515..2447c3887b3 100644 --- a/dlls/cryptdlg/main.c +++ b/dlls/cryptdlg/main.c @@ -106,6 +106,24 @@ HRESULT WINAPI CertTrustFinalPolicy(CRYPT_PROVIDER_DATA *pProvData) } /*********************************************************************** + * CertViewPropertiesA (CRYPTDLG.@) + */ +BOOL WINAPI CertViewPropertiesA(CERT_VIEWPROPERTIES_STRUCT_A *info) +{ + FIXME("(%p): stub\n", info); + return FALSE; +} + +/*********************************************************************** + * CertViewPropertiesW (CRYPTDLG.@) + */ +BOOL WINAPI CertViewPropertiesW(CERT_VIEWPROPERTIES_STRUCT_W *info) +{ + FIXME("(%p): stub\n", info); + return FALSE; +} + +/*********************************************************************** * DllRegisterServer (CRYPTDLG.@) */ HRESULT WINAPI DllRegisterServer(void) diff --git a/dlls/cryptui/cryptui.spec b/dlls/cryptui/cryptui.spec index aa4b00a44a8..b023ed2ab61 100644 --- a/dlls/cryptui/cryptui.spec +++ b/dlls/cryptui/cryptui.spec @@ -1,5 +1,5 @@ 1 stub ACUIProviderInvokeUI -2 stub CryptUIDlgCertMgr +2 stdcall CryptUIDlgCertMgr(ptr) 3 stub CryptUIDlgFreeCAContext 4 stub CryptUIDlgSelectCA 5 stub CryptUIDlgSelectCertificateA diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c index a951f013dc4..87849156e5c 100644 --- a/dlls/cryptui/main.c +++ b/dlls/cryptui/main.c @@ -22,6 +22,8 @@ #include "windef.h" #include "winbase.h" +#include "winuser.h" +#include "cryptuiapi.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(cryptui); @@ -44,3 +46,12 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) } return TRUE; } + +/*********************************************************************** + * CryptUIDlgCertMgr (CRYPTUI.@) + */ +BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr) +{ + FIXME("(%p): stub\n", pCryptUICertMgr); + return FALSE; +} diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index d36411f0672..c889e7e1cda 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -9576,6 +9576,82 @@ static void alphareplicate_test(IDirect3DDevice9 *device) { } +static void dp3_alpha_test(IDirect3DDevice9 *device) { + HRESULT hr; + D3DCAPS9 caps; + DWORD color; + struct vertex quad[] = { + { -1.0, -1.0, 0.1, 0x408080c0 }, + { 1.0, -1.0, 0.1, 0x408080c0 }, + { -1.0, 1.0, 0.1, 0x408080c0 }, + { 1.0, 1.0, 0.1, 0x408080c0 }, + }; + + memset(&caps, 0, sizeof(caps)); + hr = IDirect3DDevice9_GetDeviceCaps(device, &caps); + ok(SUCCEEDED(hr), "GetDeviceCaps failed with 0x%08x\n", hr); + if (!(caps.TextureOpCaps & D3DTEXOPCAPS_DOTPRODUCT3)) { + skip("D3DTOP_DOTPRODUCT3 not supported\n"); + return; + } + + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); + ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with 0x%08x\n", hr); + + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF failed with 0x%08x\n", hr); + + /* dp3_x4 r0, diffuse_bias, tfactor_bias + * mov r0.a, diffuse.a + * mov r0, r0.a + * + * It turns out that the 2nd line is ignored, and the dp3 result written into r0.a instead + * thus with input vec4(0.5, 0.5, 0.75, 0.25) and vec4(1.0, 1.0, 1.0, 1.0) the result is + * (0.0 * 0.5 + 0.0 * 0.5 + 0.25 * 0.5) * 4 = 0.125 * 4 = 0.5, with a bunch of inprecision. + */ + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2, D3DTA_TFACTOR); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLORARG1, D3DTA_CURRENT | D3DTA_ALPHAREPLICATE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_TEXTUREFACTOR, 0xffffffff); + ok(SUCCEEDED(hr), "IDirect3DDevice9_SetRenderState failed with 0x%08x\n", hr); + + hr = IDirect3DDevice9_BeginScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with 0x%08x\n", hr); + if(SUCCEEDED(hr)) { + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(SUCCEEDED(hr), "DrawPrimitiveUP failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_EndScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with 0x%08x\n", hr); + } + + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "IDirect3DDevice9_Present failed with 0x%08x\n", hr); + + color = getPixelColor(device, 320, 240); + ok(color_match(color, 0x00808080, 4), "dp3 alpha test 0x%08x, expected 0x00808080\n", + color); + + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_DISABLE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); + hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTextureStageState failed with 0x%08x\n", hr); +} + START_TEST(visual) { IDirect3DDevice9 *device_ptr; @@ -9732,9 +9808,11 @@ START_TEST(visual) } } else skip("No ps_1_1 support\n"); + texop_test(device_ptr); texop_range_test(device_ptr); alphareplicate_test(device_ptr); + dp3_alpha_test(device_ptr); cleanup: if(device_ptr) { diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index 128134668a2..30c8bdbd29a 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -77,7 +77,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dxof); #define TOKEN_CSTRING 51 #define TOKEN_ARRAY 52 -#define CLSIDFMT "<%08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X>" +#define CLSIDFMT "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>" typedef struct { /* Buffer to parse */ @@ -383,7 +383,7 @@ static BOOL is_guid(parse_buffer* buf) } tmp[pos++] = '>'; tmp[pos] = 0; - if (pos != 37 /* <+35+> */) + if (pos != 38 /* <+36+> */) { TRACE("Wrong guid %s (%d) \n", tmp, pos); return FALSE; diff --git a/dlls/d3dxof/tests/d3dxof.c b/dlls/d3dxof/tests/d3dxof.c index b38fa5d61b4..bdc1431034e 100644 --- a/dlls/d3dxof/tests/d3dxof.c +++ b/dlls/d3dxof/tests/d3dxof.c @@ -30,10 +30,10 @@ char template[] = "xof 0302txt 0064\n" "template Header\n" "{\n" -"<3D82AB43-62DA-11CF-AB390020AF71E433>\n" -"WORD major ;\n" -"WORD minor ;\n" -"DWORD flags ;\n" +"<3D82AB43-62DA-11CF-AB39-0020AF71E433>\n" +"WORD major;\n" +"WORD minor;\n" +"DWORD flags;\n" "}\n"; static void init_function_pointers(void) @@ -79,7 +79,6 @@ static void test_d3dxof(void) ref = IDirectXFile_Release(lpDirectXFile); ok(ref == 1, "Got refcount %ld, expected 1\n", ref); - /* RegisterTemplates does not support txt format yet */ hr = IDirectXFile_RegisterTemplates(lpDirectXFile, template, strlen(template)); ok(hr == DXFILE_OK, "IDirectXFileImpl_RegisterTemplates: %x\n", hr); diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 73982edc777..436846cb4df 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -880,8 +880,9 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, { ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface); WINED3DFORMAT formats[] = { - WINED3DFMT_YUY2, WINED3DFMT_UYVY, + WINED3DFMT_YUY2, WINED3DFMT_UYVY, WINED3DFMT_YV12, WINED3DFMT_DXT1, WINED3DFMT_DXT2, WINED3DFMT_DXT3, WINED3DFMT_DXT4, WINED3DFMT_DXT5, + WINED3DFMT_ATI2N, WINED3DFMT_NVHU, WINED3DFMT_NVHS }; DWORD count = 0, i, outsize; HRESULT hr; diff --git a/dlls/gdi32/tests/pen.c b/dlls/gdi32/tests/pen.c index fcd79e636d3..8b2e41a575a 100644 --- a/dlls/gdi32/tests/pen.c +++ b/dlls/gdi32/tests/pen.c @@ -29,6 +29,8 @@ #include "wine/test.h" #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) +#define expect2(expected, alt, got) ok(got == expected || got == alt, \ + "Expected %.8x or %.8x, got %.8x\n", expected, alt, got) static void test_logpen(void) { @@ -504,7 +506,7 @@ static void test_ps_userstyle(void) pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, 0, style); ok(pen == 0, "ExtCreatePen should fail\n"); - expect(0xdeadbeef, GetLastError()); + expect2(0xdeadbeef, ERROR_INVALID_PARAMETER, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef); diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index 70f7bb04b3e..3a9d36ddd50 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -169,6 +169,9 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC hdc, if(!logfont || !font) return InvalidParameter; + if (logfont->lfFaceName[0] == 0) + return NotTrueTypeFont; + *font = GdipAlloc(sizeof(GpFont)); if(!*font) return OutOfMemory; @@ -250,6 +253,29 @@ GpStatus WINGDIPAPI GdipCreateFontFromDC(HDC hdc, GpFont **font) return GdipCreateFontFromLogfontW(hdc, &lfw, font); } +/******************************************************************************* + * GdipGetFamily [GDIPLUS.@] + * + * Returns the FontFamily for the specified Font + * + * PARAMS + * font [I] Font to request from + * family [O] Resulting FontFamily object + * + * RETURNS + * SUCCESS: Ok + * FAILURE: An element of GpStatus + */ +GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family) +{ + TRACE("%p %p\n", font, family); + + if (!(font && family)) + return InvalidParameter; + + return GdipCreateFontFamilyFromName(font->lfw.lfFaceName, NULL, family); +} + /****************************************************************************** * GdipGetFontSize [GDIPLUS.@] * @@ -276,6 +302,40 @@ GpStatus WINGDIPAPI GdipGetFontSize(GpFont *font, REAL *size) } /******************************************************************************* + * GdipGetFontStyle [GDIPLUS.@] + * + * Gets the font's style, returned in bitwise OR of FontStyle enumeration + * + * PARAMS + * font [I] font to request from + * style [O] resulting pointer to a FontStyle enumeration + * + * RETURNS + * SUCCESS: Ok + * FAILURE: InvalidParameter + */ +GpStatus WINGDIPAPI GdipGetFontStyle(GpFont *font, INT *style) +{ + TRACE("%p %p\n", font, style); + + if (!(font && style)) + return InvalidParameter; + + if (font->lfw.lfWeight > 400) + *style = FontStyleBold; + else + *style = 0; + if (font->lfw.lfItalic) + *style |= FontStyleItalic; + if (font->lfw.lfUnderline) + *style |= FontStyleUnderline; + if (font->lfw.lfStrikeOut) + *style |= FontStyleStrikeout; + + return Ok; +} + +/******************************************************************************* * GdipGetFontUnit [GDIPLUS.@] * * PARAMS @@ -327,6 +387,31 @@ GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) } /******************************************************************************* + * GdipGetFontHeight [GDIPLUS.@] + * PARAMS + * font [I] Font to retrieve height from + * graphics [I] The current graphics context + * height [O] Resulting height + * RETURNS + * SUCCESS: Ok + * FAILURE: Another element of GpStatus + * + * NOTES + * Forwards to GdipGetFontHeightGivenDPI + */ +GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont *font, + GDIPCONST GpGraphics *graphics, REAL *height) +{ + REAL dpi; + + TRACE("%p %p %p\n", font, graphics, height); + + dpi = GetDeviceCaps(graphics->hdc, LOGPIXELSY); + + return GdipGetFontHeightGivenDPI(font, dpi, height); +} + +/******************************************************************************* * GdipGetFontHeightGivenDPI [GDIPLUS.@] * PARAMS * font [I] Font to retrieve DPI from @@ -343,12 +428,22 @@ GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) */ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height) { + TRACE("%p (%s), %f, %p\n", font, + debugstr_w(font->lfw.lfFaceName), dpi, height); + if (!(font && height)) return InvalidParameter; - FIXME("%p (%s), %f, %p\n", font, - debugstr_w(font->lfw.lfFaceName), dpi, height); + switch (font->unit) + { + case UnitPixel: + *height = font->emSize; + break; + default: + FIXME("Unhandled unit type: %d\n", font->unit); + return NotImplemented; + } - return NotImplemented; + return Ok; } /*********************************************************************** diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c index 5e449e2f348..17e4d3329f2 100644 --- a/dlls/gdiplus/gdiplus.c +++ b/dlls/gdiplus/gdiplus.c @@ -344,3 +344,25 @@ BOOL lengthen_path(GpPath *path, INT len) return TRUE; } + +/* recursive deletion of GpRegion nodes */ +inline void delete_element(region_element* element) +{ + switch(element->type) + { + case RegionDataRect: + break; + case RegionDataPath: + GdipDeletePath(element->elementdata.pathdata.path); + break; + case RegionDataEmptyRect: + case RegionDataInfiniteRect: + break; + default: + delete_element(element->elementdata.combine.left); + delete_element(element->elementdata.combine.right); + GdipFree(element->elementdata.combine.left); + GdipFree(element->elementdata.combine.right); + break; + } +} diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index c5b7c2f87d0..725c0246a4f 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -233,7 +233,7 @@ @ stdcall GdipFillRegion(ptr ptr ptr) @ stdcall GdipFindFirstImageItem(ptr ptr) @ stub GdipFindNextImageItem -@ stub GdipFlattenPath +@ stdcall GdipFlattenPath(ptr ptr long) @ stdcall GdipFlush(ptr long) @ stdcall GdipFree(ptr) @ stub GdipGetAdjustableArrowCapFillState @@ -263,14 +263,14 @@ @ stdcall GdipGetEmHeight(ptr long ptr) @ stub GdipGetEncoderParameterList @ stub GdipGetEncoderParameterListSize -@ stub GdipGetFamily +@ stdcall GdipGetFamily(ptr ptr) @ stdcall GdipGetFamilyName(ptr ptr long) @ stdcall GdipGetFontCollectionFamilyCount(ptr ptr) @ stdcall GdipGetFontCollectionFamilyList(ptr long ptr ptr) -@ stub GdipGetFontHeight +@ stdcall GdipGetFontHeight(ptr ptr ptr) @ stdcall GdipGetFontHeightGivenDPI(ptr long ptr) @ stdcall GdipGetFontSize(ptr ptr) -@ stub GdipGetFontStyle +@ stdcall GdipGetFontStyle(ptr ptr) @ stdcall GdipGetFontUnit(ptr ptr) @ stdcall GdipGetGenericFontFamilyMonospace(ptr) @ stdcall GdipGetGenericFontFamilySansSerif(ptr) @@ -414,7 +414,7 @@ @ stub GdipImageSetAbort @ stub GdipInitializePalette @ stdcall GdipInvertMatrix(ptr) -@ stub GdipIsClipEmpty +@ stdcall GdipIsClipEmpty(ptr ptr) @ stdcall GdipIsEmptyRegion(ptr ptr ptr) @ stdcall GdipIsEqualRegion(ptr ptr ptr ptr) @ stdcall GdipIsInfiniteRegion(ptr ptr ptr) @@ -458,7 +458,7 @@ @ stdcall GdipPathIterIsValid(ptr ptr) @ stdcall GdipPathIterNextMarker(ptr ptr ptr ptr) @ stdcall GdipPathIterNextMarkerPath(ptr ptr ptr) -@ stub GdipPathIterNextPathType +@ stdcall GdipPathIterNextPathType(ptr ptr ptr ptr ptr) @ stdcall GdipPathIterNextSubpath(ptr ptr ptr ptr ptr) @ stdcall GdipPathIterNextSubpathPath(ptr ptr ptr ptr) @ stdcall GdipPathIterRewind(ptr) @@ -474,7 +474,7 @@ @ stub GdipRecordMetafileStreamI @ stdcall GdipReleaseDC(ptr ptr) @ stdcall GdipRemovePropertyItem(ptr long) -@ stub GdipResetClip +@ stdcall GdipResetClip(ptr) @ stub GdipResetImageAttributes @ stub GdipResetLineTransform @ stub GdipResetPageTransform diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 8df1c74b5b0..4eb847c8c47 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -54,6 +54,9 @@ extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj, extern BOOL lengthen_path(GpPath *path, INT len); +typedef struct region_element region_element; +extern inline void delete_element(region_element *element); + static inline INT roundr(REAL x) { return (INT) floorf(x + 0.5); @@ -96,6 +99,7 @@ struct GpGraphics{ REAL scale; /* page scale */ GpMatrix * worldtrans; /* world transform */ BOOL busy; /* hdc handle obtained by GdipGetDC */ + GpRegion *clip; }; struct GpBrush{ @@ -218,7 +222,16 @@ struct GpFontFamily{ WCHAR FamilyName[LF_FACESIZE]; }; -typedef struct region_element +/* internal use */ +typedef enum RegionType +{ + RegionDataRect = 0x10000000, + RegionDataPath = 0x10000001, + RegionDataEmptyRect = 0x10000002, + RegionDataInfiniteRect = 0x10000003, +} RegionType; + +struct region_element { DWORD type; /* Rectangle, Path, SpecialRectangle, or CombineMode */ union @@ -241,7 +254,7 @@ typedef struct region_element struct region_element *right; /* what *left was combined with */ } combine; } elementdata; -} region_element; +}; struct GpRegion{ struct diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index bf3a6381ab4..d91d825b3db 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -743,6 +743,12 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra return retval; } + if((retval = GdipCreateRegion(&(*graphics)->clip)) != Ok){ + GdipFree((*graphics)->worldtrans); + GdipFree(*graphics); + return retval; + } + (*graphics)->hdc = hdc; (*graphics)->hwnd = NULL; (*graphics)->smoothing = SmoothingModeDefault; @@ -894,6 +900,7 @@ GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics) if(graphics->hwnd) ReleaseDC(graphics->hwnd, graphics->hdc); + GdipDeleteRegion(graphics->clip); GdipDeleteMatrix(graphics->worldtrans); GdipFree(graphics); @@ -2385,6 +2392,14 @@ GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix return Ok; } +GpStatus WINGDIPAPI GdipIsClipEmpty(GpGraphics *graphics, BOOL *res) +{ + if(!graphics || !res) + return InvalidParameter; + + return GdipIsEmptyRegion(graphics->clip, graphics, res); +} + GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, @@ -2507,6 +2522,17 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, return Ok; } +GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) +{ + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + return GdipSetInfinite(graphics->clip); +} + GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics) { if(!graphics) @@ -2730,14 +2756,17 @@ GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics *graphics, INT x, INT y, } GpStatus WINGDIPAPI GdipSetClipRegion(GpGraphics *graphics, GpRegion *region, - CombineMode combineMode) + CombineMode mode) { - static int calls; + TRACE("(%p, %p, %d)\n", graphics, region, mode); - if(!(calls++)) - FIXME("not implemented\n"); + if(!graphics || !region) + return InvalidParameter; - return NotImplemented; + if(graphics->busy) + return ObjectBusy; + + return GdipCombineRegionRegion(graphics->clip, region, mode); } GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile *metafile, @@ -2874,14 +2903,25 @@ GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc) GpStatus WINGDIPAPI GdipGetClip(GpGraphics *graphics, GpRegion *region) { + GpRegion *clip; + GpStatus status; + + TRACE("(%p, %p)\n", graphics, region); + if(!graphics || !region) return InvalidParameter; if(graphics->busy) return ObjectBusy; - FIXME("(%p, %p): stub\n", graphics, region); - return NotImplemented; + if((status = GdipCloneRegion(graphics->clip, &clip)) != Ok) + return status; + + /* free everything except root node and header */ + delete_element(®ion->node); + memcpy(region, clip, sizeof(GpRegion)); + + return Ok; } GpStatus WINGDIPAPI GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace dst_space, diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index d465aaf8bda..d0f5dc0f89d 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -38,6 +38,9 @@ GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x1, REAL y1, REAL x2, { INT count, old_count, i; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", + path, x1, y1, x2, y2, startAngle, sweepAngle); + if(!path) return InvalidParameter; @@ -67,6 +70,9 @@ GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x1, REAL y1, REAL x2, GpStatus WINGDIPAPI GdipAddPathArcI(GpPath *path, INT x1, INT y1, INT x2, INT y2, REAL startAngle, REAL sweepAngle) { + TRACE("(%p, %d, %d, %d, %d, %.2f, %.2f)\n", + path, x1, y1, x2, y2, startAngle, sweepAngle); + return GdipAddPathArc(path,(REAL)x1,(REAL)y1,(REAL)x2,(REAL)y2,startAngle,sweepAngle); } @@ -75,6 +81,9 @@ GpStatus WINGDIPAPI GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, { INT old_count; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", + path, x1, y1, x2, y2, x3, y3, x4, y4); + if(!path) return InvalidParameter; @@ -107,6 +116,9 @@ GpStatus WINGDIPAPI GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, GpStatus WINGDIPAPI GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4) { + TRACE("(%p, %d, %d, %d, %d, %d, %d, %d, %d)\n", + path, x1, y1, x2, y2, x3, y3, x4, y4); + return GdipAddPathBezier(path,(REAL)x1,(REAL)y1,(REAL)x2,(REAL)y2,(REAL)x3,(REAL)y3, (REAL)x4,(REAL)y4); } @@ -116,6 +128,8 @@ GpStatus WINGDIPAPI GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, { INT i, old_count; + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path || !points || ((count - 1) % 3)) return InvalidParameter; @@ -145,6 +159,8 @@ GpStatus WINGDIPAPI GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, GpStatus ret; INT i; + TRACE("(%p, %p, %d)\n", path, points, count); + if(!points || ((count - 1) % 3)) return InvalidParameter; @@ -166,12 +182,16 @@ GpStatus WINGDIPAPI GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, GpStatus WINGDIPAPI GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count) { + TRACE("(%p, %p, %d)\n", path, points, count); + return GdipAddPathClosedCurve2(path, points, count, 1.0); } GpStatus WINGDIPAPI GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count) { + TRACE("(%p, %p, %d)\n", path, points, count); + return GdipAddPathClosedCurve2I(path, points, count, 1.0); } @@ -184,6 +204,8 @@ GpStatus WINGDIPAPI GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *po REAL x1, x2, y1, y2; GpStatus stat; + TRACE("(%p, %p, %d, %.2f)\n", path, points, count, tension); + if(!path || !points || count <= 1) return InvalidParameter; @@ -251,6 +273,8 @@ GpStatus WINGDIPAPI GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *po INT i; GpStatus stat; + TRACE("(%p, %p, %d, %.2f)\n", path, points, count, tension); + if(!path || !points || count <= 1) return InvalidParameter; @@ -272,18 +296,22 @@ GpStatus WINGDIPAPI GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *po GpStatus WINGDIPAPI GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count) { + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path || !points || count <= 1) return InvalidParameter; - return GdipAddPathCurve2(path, points, count, 1.0); + return GdipAddPathCurve2(path, points, count, 1.0); } GpStatus WINGDIPAPI GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count) { + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path || !points || count <= 1) return InvalidParameter; - return GdipAddPathCurve2I(path, points, count, 1.0); + return GdipAddPathCurve2I(path, points, count, 1.0); } GpStatus WINGDIPAPI GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count, @@ -294,6 +322,8 @@ GpStatus WINGDIPAPI GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, REAL x1, x2, y1, y2; GpStatus stat; + TRACE("(%p, %p, %d, %.2f)\n", path, points, count, tension); + if(!path || !points || count <= 1) return InvalidParameter; @@ -344,6 +374,8 @@ GpStatus WINGDIPAPI GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT i; GpStatus stat; + TRACE("(%p, %p, %d, %.2f)\n", path, points, count, tension); + if(!path || !points || count <= 1) return InvalidParameter; @@ -368,6 +400,8 @@ GpStatus WINGDIPAPI GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width, { INT old_count, numpts; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f)\n", path, x, y, width, height); + if(!path) return InvalidParameter; @@ -396,6 +430,8 @@ GpStatus WINGDIPAPI GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width, GpStatus WINGDIPAPI GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height) { + TRACE("(%p, %d, %d, %d, %d)\n", path, x, y, width, height); + return GdipAddPathEllipse(path,(REAL)x,(REAL)y,(REAL)width,(REAL)height); } @@ -404,6 +440,8 @@ GpStatus WINGDIPAPI GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, { INT i, old_count; + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path || !points) return InvalidParameter; @@ -434,6 +472,8 @@ GpStatus WINGDIPAPI GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, I INT i; GpStatus stat; + TRACE("(%p, %p, %d)\n", path, points, count); + if(count <= 0) return InvalidParameter; @@ -456,6 +496,8 @@ GpStatus WINGDIPAPI GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REA { INT old_count; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f)\n", path, x1, y1, x2, y2); + if(!path) return InvalidParameter; @@ -481,6 +523,8 @@ GpStatus WINGDIPAPI GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REA GpStatus WINGDIPAPI GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2) { + TRACE("(%p, %d, %d, %d, %d)\n", path, x1, y1, x2, y2); + return GdipAddPathLine(path, (REAL)x1, (REAL)y1, (REAL)x2, (REAL)y2); } @@ -489,6 +533,8 @@ GpStatus WINGDIPAPI GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, { INT old_count, count; + TRACE("(%p, %p, %d)\n", path, addingPath, connect); + if(!path || !addingPath) return InvalidParameter; @@ -520,6 +566,9 @@ GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REA GpStatus status; INT i, count; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", + path, x, y, width, height, startAngle, sweepAngle); + if(!path) return InvalidParameter; @@ -561,6 +610,9 @@ GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REA GpStatus WINGDIPAPI GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) { + TRACE("(%p, %d, %d, %d, %d, %.2f, %.2f)\n", + path, x, y, width, height, startAngle, sweepAngle); + return GdipAddPathPieI(path, (REAL)x, (REAL)y, (REAL)width, (REAL)height, startAngle, sweepAngle); } @@ -568,6 +620,8 @@ GpStatus WINGDIPAPI GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, { INT old_count; + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path || !points || count < 3) return InvalidParameter; @@ -594,6 +648,8 @@ GpStatus WINGDIPAPI GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, GpStatus status; INT i; + TRACE("(%p, %p, %d)\n", path, points, count); + if(!points || count < 3) return InvalidParameter; @@ -615,6 +671,8 @@ GpStatus WINGDIPAPI GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, GpStatus WINGDIPAPI GdipClonePath(GpPath* path, GpPath **clone) { + TRACE("(%p, %p)\n", path, clone); + if(!path || !clone) return InvalidParameter; @@ -641,6 +699,8 @@ GpStatus WINGDIPAPI GdipClonePath(GpPath* path, GpPath **clone) GpStatus WINGDIPAPI GdipClosePathFigure(GpPath* path) { + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -656,6 +716,8 @@ GpStatus WINGDIPAPI GdipClosePathFigures(GpPath* path) { INT i; + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -671,6 +733,8 @@ GpStatus WINGDIPAPI GdipClosePathFigures(GpPath* path) GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path) { + TRACE("(%d, %p)\n", fill, path); + if(!path) return InvalidParameter; @@ -686,6 +750,8 @@ GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path) GpStatus WINGDIPAPI GdipCreatePath2(GDIPCONST GpPointF* points, GDIPCONST BYTE* types, INT count, GpFillMode fill, GpPath **path) { + TRACE("(%p, %p, %d, %d, %p)\n", points, types, count, fill, path); + if(!path) return InvalidParameter; @@ -720,6 +786,8 @@ GpStatus WINGDIPAPI GdipCreatePath2I(GDIPCONST GpPoint* points, GpStatus ret; INT i; + TRACE("(%p, %p, %d, %d, %p)\n", points, types, count, fill, path); + ptF = GdipAlloc(sizeof(GpPointF)*count); for(i = 0;i < count; i++){ @@ -736,6 +804,8 @@ GpStatus WINGDIPAPI GdipCreatePath2I(GDIPCONST GpPoint* points, GpStatus WINGDIPAPI GdipDeletePath(GpPath *path) { + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -746,8 +816,23 @@ GpStatus WINGDIPAPI GdipDeletePath(GpPath *path) return Ok; } +GpStatus WINGDIPAPI GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness) +{ + static int calls; + + if(!path) + return InvalidParameter; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipGetPathData(GpPath *path, GpPathData* pathData) { + TRACE("(%p, %p)\n", path, pathData); + if(!path || !pathData) return InvalidParameter; @@ -761,6 +846,8 @@ GpStatus WINGDIPAPI GdipGetPathData(GpPath *path, GpPathData* pathData) GpStatus WINGDIPAPI GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode) { + TRACE("(%p, %p)\n", path, fillmode); + if(!path || !fillmode) return InvalidParameter; @@ -773,6 +860,8 @@ GpStatus WINGDIPAPI GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint) { INT count; + TRACE("(%p, %p)\n", path, lastPoint); + if(!path || !lastPoint) return InvalidParameter; @@ -785,6 +874,8 @@ GpStatus WINGDIPAPI GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint) GpStatus WINGDIPAPI GdipGetPathPoints(GpPath *path, GpPointF* points, INT count) { + TRACE("(%p, %p, %d)\n", path, points, count); + if(!path) return InvalidParameter; @@ -802,6 +893,8 @@ GpStatus WINGDIPAPI GdipGetPathPointsI(GpPath *path, GpPoint* points, INT count) GpPointF *ptf; INT i; + TRACE("(%p, %p, %d)\n", path, points, count); + if(count <= 0) return InvalidParameter; @@ -821,6 +914,8 @@ GpStatus WINGDIPAPI GdipGetPathPointsI(GpPath *path, GpPoint* points, INT count) GpStatus WINGDIPAPI GdipGetPathTypes(GpPath *path, BYTE* types, INT count) { + TRACE("(%p, %p, %d)\n", path, types, count); + if(!path) return InvalidParameter; @@ -843,6 +938,8 @@ GpStatus WINGDIPAPI GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, INT count, i; REAL path_width = 1.0, width, height, temp, low_x, low_y, high_x, high_y; + TRACE("(%p, %p, %p, %p)\n", path, bounds, matrix, pen); + /* Matrix and pen can be null. */ if(!path || !bounds) return InvalidParameter; @@ -923,6 +1020,8 @@ GpStatus WINGDIPAPI GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GpStatus ret; GpRectF boundsF; + TRACE("(%p, %p, %p, %p)\n", path, bounds, matrix, pen); + ret = GdipGetPathWorldBounds(path,&boundsF,matrix,pen); if(ret == Ok){ @@ -937,6 +1036,8 @@ GpStatus WINGDIPAPI GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GpStatus WINGDIPAPI GdipGetPointCount(GpPath *path, INT *count) { + TRACE("(%p, %p)\n", path, count); + if(!path) return InvalidParameter; @@ -951,6 +1052,8 @@ GpStatus WINGDIPAPI GdipReversePath(GpPath* path) INT start = 0; /* position in reversed path */ GpPathData revpath; + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -1002,6 +1105,8 @@ GpStatus WINGDIPAPI GdipReversePath(GpPath* path) GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen, GpGraphics *graphics, BOOL *result) { + TRACE("(%p, %d, %d, %p, %p, %p)\n", path, x, y, pen, graphics, result); + return GdipIsOutlineVisiblePathPoint(path, x, y, pen, graphics, result); } @@ -1021,6 +1126,8 @@ GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpStatus WINGDIPAPI GdipIsVisiblePathPointI(GpPath* path, INT x, INT y, GpGraphics *graphics, BOOL *result) { + TRACE("(%p, %d, %d, %p, %p)\n", path, x, y, graphics, result); + return GdipIsVisiblePathPoint(path, x, y, graphics, result); } @@ -1038,6 +1145,8 @@ GpStatus WINGDIPAPI GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y, GpGraph GpStatus WINGDIPAPI GdipStartPathFigure(GpPath *path) { + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -1048,6 +1157,8 @@ GpStatus WINGDIPAPI GdipStartPathFigure(GpPath *path) GpStatus WINGDIPAPI GdipResetPath(GpPath *path) { + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -1060,6 +1171,8 @@ GpStatus WINGDIPAPI GdipResetPath(GpPath *path) GpStatus WINGDIPAPI GdipSetPathFillMode(GpPath *path, GpFillMode fill) { + TRACE("(%p, %d)\n", path, fill); + if(!path) return InvalidParameter; @@ -1070,6 +1183,8 @@ GpStatus WINGDIPAPI GdipSetPathFillMode(GpPath *path, GpFillMode fill) GpStatus WINGDIPAPI GdipTransformPath(GpPath *path, GpMatrix *matrix) { + TRACE("(%p, %p)\n", path, matrix); + if(!path) return InvalidParameter; @@ -1088,6 +1203,8 @@ GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath *path, REAL x, REAL y, GpStatus retstat; BOOL old_new; + TRACE("(%p, %.2f, %.2f, %.2f, %.2f)\n", path, x, y, width, height); + if(!path || width < 0.0 || height < 0.0) return InvalidParameter; @@ -1127,6 +1244,8 @@ fail: GpStatus WINGDIPAPI GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height) { + TRACE("(%p, %d, %d, %d, %d)\n", path, x, y, width, height); + return GdipAddPathRectangle(path,(REAL)x,(REAL)y,(REAL)width,(REAL)height); } @@ -1136,6 +1255,8 @@ GpStatus WINGDIPAPI GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects GpStatus retstat; INT i; + TRACE("(%p, %p, %d)\n", path, rects, count); + /* count == 0 - verified condition */ if(!path || !rects || count == 0) return InvalidParameter; @@ -1171,6 +1292,8 @@ GpStatus WINGDIPAPI GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects GpStatus retstat; INT i; + TRACE("(%p, %p, %d)\n", path, rects, count); + if(!rects || count == 0) return InvalidParameter; @@ -1196,6 +1319,8 @@ GpStatus WINGDIPAPI GdipSetPathMarker(GpPath* path) { INT count; + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; @@ -1213,6 +1338,8 @@ GpStatus WINGDIPAPI GdipClearPathMarkers(GpPath* path) INT count; INT i; + TRACE("(%p)\n", path); + if(!path) return InvalidParameter; diff --git a/dlls/gdiplus/matrix.c b/dlls/gdiplus/matrix.c index a29508db8b0..008dcae33cd 100644 --- a/dlls/gdiplus/matrix.c +++ b/dlls/gdiplus/matrix.c @@ -27,6 +27,9 @@ #include "gdiplus.h" #include "gdiplus_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); /* Multiplies two matrices of the form * diff --git a/dlls/gdiplus/pathiterator.c b/dlls/gdiplus/pathiterator.c index d6a68506335..d0a4ed19c7f 100644 --- a/dlls/gdiplus/pathiterator.c +++ b/dlls/gdiplus/pathiterator.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2007 Google (Evan Stade) + * Copyright (C) 2008 Nikolay Sivov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,11 +27,16 @@ #include "gdiplus.h" #include "gdiplus_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); GpStatus WINGDIPAPI GdipCreatePathIter(GpPathIterator **iterator, GpPath* path) { INT size; + TRACE("(%p, %p)\n", iterator, path); + if(!iterator) return InvalidParameter; @@ -62,6 +68,8 @@ GpStatus WINGDIPAPI GdipCreatePathIter(GpPathIterator **iterator, GpPath* path) GpStatus WINGDIPAPI GdipDeletePathIter(GpPathIterator *iter) { + TRACE("(%p)\n", iter); + if(!iter) return InvalidParameter; @@ -75,6 +83,9 @@ GpStatus WINGDIPAPI GdipDeletePathIter(GpPathIterator *iter) GpStatus WINGDIPAPI GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount, GpPointF* points, BYTE* types, INT startIndex, INT endIndex) { + TRACE("(%p, %p, %p, %p, %d, %d)\n", iterator, resultCount, points, types, + startIndex, endIndex); + if(!iterator || !types || !points) return InvalidParameter; @@ -97,6 +108,8 @@ GpStatus WINGDIPAPI GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurv { INT i; + TRACE("(%p, %p)\n", iterator, hasCurve); + if(!iterator) return InvalidParameter; @@ -115,6 +128,8 @@ GpStatus WINGDIPAPI GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* c { INT i; + TRACE("(%p, %p)\n", iterator, count); + if(!iterator || !count) return InvalidParameter; @@ -132,6 +147,8 @@ GpStatus WINGDIPAPI GdipPathIterNextMarker(GpPathIterator* iterator, INT *result { INT i; + TRACE("(%p, %p, %p, %p)\n", iterator, resultCount, startIndex, endIndex); + if(!iterator || !startIndex || !endIndex) return InvalidParameter; @@ -158,6 +175,8 @@ GpStatus WINGDIPAPI GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* re { INT start, end; + TRACE("(%p, %p, %p)\n", iterator, result, path); + if(!iterator || !result) return InvalidParameter; @@ -182,6 +201,9 @@ GpStatus WINGDIPAPI GdipPathIterNextSubpath(GpPathIterator* iterator, { INT i, count; + TRACE("(%p, %p, %p, %p, %p)\n", iterator, resultCount, startIndex, + endIndex, isClosed); + if(!iterator || !startIndex || !endIndex || !isClosed || !resultCount) return InvalidParameter; @@ -218,6 +240,8 @@ GpStatus WINGDIPAPI GdipPathIterNextSubpath(GpPathIterator* iterator, } GpStatus WINGDIPAPI GdipPathIterRewind(GpPathIterator *iterator) { + TRACE("(%p)\n", iterator); + if(!iterator) return InvalidParameter; @@ -230,6 +254,8 @@ GpStatus WINGDIPAPI GdipPathIterRewind(GpPathIterator *iterator) GpStatus WINGDIPAPI GdipPathIterGetCount(GpPathIterator* iterator, INT* count) { + TRACE("(%p, %p)\n", iterator, count); + if(!iterator || !count) return InvalidParameter; @@ -241,6 +267,8 @@ GpStatus WINGDIPAPI GdipPathIterGetCount(GpPathIterator* iterator, INT* count) GpStatus WINGDIPAPI GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount, GpPointF *points, BYTE *types, INT count) { + TRACE("(%p, %p, %p, %p, %d)\n", iterator, resultCount, points, types, count); + if((count < 0) || !resultCount) return InvalidParameter; @@ -254,6 +282,8 @@ GpStatus WINGDIPAPI GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultC GpStatus WINGDIPAPI GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid) { + TRACE("(%p, %p)\n", iterator, valid); + if(!iterator || !valid) return InvalidParameter; @@ -262,11 +292,24 @@ GpStatus WINGDIPAPI GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid) return Ok; } +GpStatus WINGDIPAPI GdipPathIterNextPathType(GpPathIterator* iter, INT* result, + BYTE* type, INT* start, INT* end) +{ + FIXME("(%p, %p, %p, %p, %p) stub\n", iter, result, type, start, end); + + if(!iter || !result || !type || !start || !end) + return InvalidParameter; + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipPathIterNextSubpathPath(GpPathIterator* iter, INT* result, GpPath* path, BOOL* closed) { INT start, end; + TRACE("(%p, %p, %p, %p)\n", iter, result, path, closed); + if(!iter || !result || !closed) return InvalidParameter; diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c index 45d0e51fac4..f1142b78db6 100644 --- a/dlls/gdiplus/region.c +++ b/dlls/gdiplus/region.c @@ -73,14 +73,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); * */ -typedef enum RegionType -{ - RegionDataRect = 0x10000000, - RegionDataPath = 0x10000001, - RegionDataEmptyRect = 0x10000002, - RegionDataInfiniteRect = 0x10000003, -} RegionType; - #define FLAGS_NOFLAGS 0x0 #define FLAGS_INTPATH 0x4000 @@ -141,35 +133,17 @@ static inline GpStatus init_region(GpRegion* region, const RegionType type) return Ok; } -static inline void delete_element(region_element* element) -{ - switch(element->type) - { - case RegionDataRect: - break; - case RegionDataPath: - GdipDeletePath(element->elementdata.pathdata.path); - break; - case RegionDataEmptyRect: - case RegionDataInfiniteRect: - break; - default: - delete_element(element->elementdata.combine.left); - delete_element(element->elementdata.combine.right); - GdipFree(element->elementdata.combine.left); - GdipFree(element->elementdata.combine.right); - break; - } -} - static inline GpStatus clone_element(const region_element* element, region_element** element2) { GpStatus stat; - *element2 = GdipAlloc(sizeof(region_element)); - if (!*element2) - return OutOfMemory; + /* root node is allocated with GpRegion */ + if(!*element2){ + *element2 = GdipAlloc(sizeof(region_element)); + if (!*element2) + return OutOfMemory; + } (*element2)->type = element->type; @@ -188,6 +162,9 @@ static inline GpStatus clone_element(const region_element* element, if (stat != Ok) goto clone_out; break; default: + (*element2)->elementdata.combine.left = NULL; + (*element2)->elementdata.combine.right = NULL; + stat = clone_element(element->elementdata.combine.left, &(*element2)->elementdata.combine.left); if (stat != Ok) goto clone_out; @@ -265,6 +242,13 @@ GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, Combin if (stat != Ok) return stat; + /* simply replace region data */ + if(mode == CombineModeReplace){ + delete_element(®ion->node); + memcpy(region, path_region, sizeof(GpRegion)); + return Ok; + } + left = GdipAlloc(sizeof(region_element)); if (!left) goto out; @@ -302,6 +286,13 @@ GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region, if (stat != Ok) return stat; + /* simply replace region data */ + if(mode == CombineModeReplace){ + delete_element(®ion->node); + memcpy(region, rect_region, sizeof(GpRegion)); + return Ok; + } + left = GdipAlloc(sizeof(region_element)); if (!left) goto out; @@ -344,14 +335,25 @@ GpStatus WINGDIPAPI GdipCombineRegionRectI(GpRegion *region, GpStatus WINGDIPAPI GdipCombineRegionRegion(GpRegion *region1, GpRegion *region2, CombineMode mode) { - region_element *left, *right; + region_element *left, *right = NULL; GpStatus stat; + GpRegion *reg2copy; TRACE("%p %p %d\n", region1, region2, mode); if(!(region1 && region2)) return InvalidParameter; + /* simply replace region data */ + if(mode == CombineModeReplace){ + stat = GdipCloneRegion(region2, ®2copy); + if(stat != Ok) return stat; + + delete_element(®ion1->node); + memcpy(region1, reg2copy, sizeof(GpRegion)); + return Ok; + } + left = GdipAlloc(sizeof(region_element)); if (!left) return OutOfMemory; @@ -373,11 +375,11 @@ GpStatus WINGDIPAPI GdipCombineRegionRegion(GpRegion *region1, GpStatus WINGDIPAPI GdipCreateRegion(GpRegion **region) { + TRACE("%p\n", region); + if(!region) return InvalidParameter; - TRACE("%p\n", region); - *region = GdipAlloc(sizeof(GpRegion)); if(!*region) return OutOfMemory; @@ -715,10 +717,11 @@ GpStatus WINGDIPAPI GdipGetRegionData(GpRegion *region, BYTE *buffer, UINT size, { INT filled = 0; + TRACE("%p, %p, %d, %p\n", region, buffer, size, needed); + if (!(region && buffer && size)) return InvalidParameter; - TRACE("%p, %p, %d, %p\n", region, buffer, size, needed); memcpy(buffer, ®ion->header, sizeof(region->header)); filled += sizeof(region->header) / sizeof(DWORD); /* With few exceptions, everything written is DWORD aligned, @@ -733,11 +736,11 @@ GpStatus WINGDIPAPI GdipGetRegionData(GpRegion *region, BYTE *buffer, UINT size, GpStatus WINGDIPAPI GdipGetRegionDataSize(GpRegion *region, UINT *needed) { + TRACE("%p, %p\n", region, needed); + if (!(region && needed)) return InvalidParameter; - TRACE("%p, %p\n", region, needed); - /* header.size doesn't count header.size and header.checksum */ *needed = region->header.size + sizeof(DWORD) * 2; @@ -757,9 +760,14 @@ GpStatus WINGDIPAPI GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HR GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BOOL *res) { - FIXME("(%p, %p, %p): stub\n", region, graphics, res); + TRACE("(%p, %p, %p)\n", region, graphics, res); - return NotImplemented; + if(!region || !graphics || !res) + return InvalidParameter; + + *res = (region->node.type == RegionDataEmptyRect); + + return Ok; } GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics, @@ -802,11 +810,11 @@ GpStatus WINGDIPAPI GdipSetInfinite(GpRegion *region) { GpStatus stat; + TRACE("%p\n", region); + if (!region) return InvalidParameter; - TRACE("%p\n", region); - delete_element(®ion->node); stat = init_region(region, RegionDataInfiniteRect); diff --git a/dlls/gdiplus/tests/font.c b/dlls/gdiplus/tests/font.c index 3d30a866c17..ab6d28c720b 100644 --- a/dlls/gdiplus/tests/font.c +++ b/dlls/gdiplus/tests/font.c @@ -41,12 +41,13 @@ static const char *debugstr_w(LPCWSTR str) static void test_createfont(void) { - GpFontFamily* fontfamily = NULL; + GpFontFamily* fontfamily = NULL, *fontfamily2; GpFont* font = NULL; GpStatus stat; Unit unit; UINT i; REAL size; + WCHAR familyname[LF_FACESIZE]; stat = GdipCreateFontFamilyFromName(nonexistent, NULL, &fontfamily); expect (FontFamilyNotFound, stat); @@ -65,6 +66,15 @@ static void test_createfont(void) expect (Ok, stat); expect (UnitPoint, unit); + stat = GdipGetFamily(font, &fontfamily2); + expect(Ok, stat); + stat = GdipGetFamilyName(fontfamily2, familyname, 0); + expect(Ok, stat); + ok (lstrcmpiW(arial, familyname) == 0, "Expected arial, got %s\n", + debugstr_w(familyname)); + stat = GdipDeleteFontFamily(fontfamily2); + expect(Ok, stat); + /* Test to see if returned size is based on unit (its not) */ GdipGetFontSize(font, &size); ok (size == 12, "Expected 12, got %f\n", size); @@ -92,6 +102,7 @@ static void test_logfont(void) GpStatus stat; GpGraphics *graphics; HDC hdc = GetDC(0); + INT style; GdipCreateFromHDC(hdc, &graphics); memset(&lfw, 0, sizeof(LOGFONTW)); @@ -101,9 +112,7 @@ static void test_logfont(void) lfw.lfFaceName[0] = 0; stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font); -todo_wine { expect(NotTrueTypeFont, stat); -} memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR)); @@ -161,6 +170,11 @@ todo_wine { expect(0, lfw2.lfQuality); expect(0, lfw2.lfPitchAndFamily); + stat = GdipGetFontStyle(font, &style); + expect(Ok, stat); + ok (style == (FontStyleItalic | FontStyleUnderline | FontStyleStrikeout), + "Expected , got %d\n", style); + GdipDeleteFont(font); GdipDeleteGraphics(graphics); diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 082ffe80e6c..b0858e1eb6c 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -485,6 +485,7 @@ static void test_Get_Release_DC(void) GpPoint pt[5]; GpRectF rectf[2]; GpRect rect[2]; + GpRegion *clip; INT i; pt[0].X = 10; @@ -523,6 +524,7 @@ static void test_Get_Release_DC(void) GdipCreateRegion(®ion); GdipCreateSolidFill((ARGB)0xdeadbeef, &brush); GdipCreatePath(FillModeAlternate, &path); + GdipCreateRegion(&clip); status = GdipCreateFromHDC(hdc, &graphics); expect(Ok, status); @@ -672,6 +674,8 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; /* GdipMeasureCharacterRanges */ /* GdipMeasureString */ + status = GdipResetClip(graphics); + expect(ObjectBusy, status); status = Ok; status = GdipResetWorldTransform(graphics); expect(ObjectBusy, status); status = Ok; /* GdipRestoreGraphics */ @@ -702,7 +706,8 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipSetClipRectI(graphics, 0, 0, 10, 10, CombineModeReplace); expect(ObjectBusy, status); status = Ok; - /* GdipSetClipRegion */ + status = GdipSetClipRegion(graphics, clip, CombineModeReplace); + expect(ObjectBusy, status); status = GdipDrawPolygon(graphics, pen, ptf, 5); expect(ObjectBusy, status); status = Ok; status = GdipDrawPolygonI(graphics, pen, pt, 5); @@ -730,6 +735,7 @@ static void test_Get_Release_DC(void) GdipDeleteBrush((GpBrush*)brush); GdipDeleteRegion(region); GdipDeleteMatrix(m); + GdipDeleteRegion(region); ReleaseDC(0, hdc); } @@ -764,7 +770,7 @@ static void test_transformpoints(void) ReleaseDC(0, hdc); } -static void test_getclip(void) +static void test_get_set_clip(void) { GpStatus status; GpGraphics *graphics = NULL; @@ -789,12 +795,82 @@ static void test_getclip(void) status = GdipGetClip(NULL, clip); expect(InvalidParameter, status); + status = GdipSetClipRegion(NULL, NULL, CombineModeReplace); + expect(InvalidParameter, status); + status = GdipSetClipRegion(graphics, NULL, CombineModeReplace); + expect(InvalidParameter, status); + res = FALSE; status = GdipGetClip(graphics, clip); - todo_wine expect(Ok, status); + expect(Ok, status); status = GdipIsInfiniteRegion(clip, graphics, &res); expect(Ok, status); - todo_wine expect(TRUE, res); + expect(TRUE, res); + + /* remains infinite after reset */ + res = FALSE; + status = GdipResetClip(graphics); + expect(Ok, status); + status = GdipGetClip(graphics, clip); + expect(Ok, status); + status = GdipIsInfiniteRegion(clip, graphics, &res); + expect(Ok, status); + expect(TRUE, res); + + /* set to empty and then reset to infinite */ + status = GdipSetEmpty(clip); + expect(Ok, status); + status = GdipSetClipRegion(graphics, clip, CombineModeReplace); + expect(Ok, status); + + status = GdipGetClip(graphics, clip); + expect(Ok, status); + res = FALSE; + status = GdipIsEmptyRegion(clip, graphics, &res); + expect(Ok, status); + expect(TRUE, res); + status = GdipResetClip(graphics); + expect(Ok, status); + status = GdipGetClip(graphics, clip); + expect(Ok, status); + res = FALSE; + status = GdipIsInfiniteRegion(clip, graphics, &res); + expect(Ok, status); + expect(TRUE, res); + + GdipDeleteRegion(clip); + + GdipDeleteGraphics(graphics); + ReleaseDC(0, hdc); +} + +static void test_isempty(void) +{ + GpStatus status; + GpGraphics *graphics = NULL; + HDC hdc = GetDC(0); + GpRegion *clip; + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + + status = GdipCreateRegion(&clip); + expect(Ok, status); + + /* NULL */ + status = GdipIsClipEmpty(NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsClipEmpty(graphics, NULL); + expect(InvalidParameter, status); + status = GdipIsClipEmpty(NULL, &res); + expect(InvalidParameter, status); + + /* default is infinite */ + res = TRUE; + status = GdipIsClipEmpty(graphics, &res); + expect(Ok, status); + expect(FALSE, res); GdipDeleteRegion(clip); @@ -823,7 +899,8 @@ START_TEST(graphics) test_GdipDrawLinesI(); test_Get_Release_DC(); test_transformpoints(); - test_getclip(); + test_get_set_clip(); + test_isempty(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index 5fad0b1e8a6..47d82058ec8 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -886,6 +886,80 @@ static void test_addpie(void) GdipDeletePath(path); } +static path_test_t flattenellipse_path[] = { + {100.0, 25.0,PathPointTypeStart, 0, 0}, /*0*/ + {99.0, 30.0, PathPointTypeLine, 0, 1}, /*1*/ + {96.0, 34.8, PathPointTypeLine, 0, 1}, /*2*/ + {91.5, 39.0, PathPointTypeLine, 0, 1}, /*3*/ + {85.5, 42.8, PathPointTypeLine, 0, 1}, /*4*/ + {69.5, 48.0, PathPointTypeLine, 0, 1}, /*5*/ + {50.0, 50.0, PathPointTypeLine, 0, 1}, /*6*/ + {30.5, 48.0, PathPointTypeLine, 0, 1}, /*7*/ + {14.8, 42.8, PathPointTypeLine, 0, 1}, /*8*/ + {8.5, 39.0, PathPointTypeLine, 0, 1}, /*9*/ + {4.0, 34.8, PathPointTypeLine, 0, 1}, /*10*/ + {1.0, 30.0, PathPointTypeLine, 0, 1}, /*11*/ + {0.0, 25.0, PathPointTypeLine, 0, 1}, /*12*/ + {1.0, 20.0, PathPointTypeLine, 0, 1}, /*13*/ + {4.0, 15.3, PathPointTypeLine, 0, 1}, /*14*/ + {8.5, 11.0, PathPointTypeLine, 0, 1}, /*15*/ + {14.8, 7.3, PathPointTypeLine, 0, 1}, /*16*/ + {30.5, 2.0, PathPointTypeLine, 0, 1}, /*17*/ + {50.0, 0.0, PathPointTypeLine, 0, 1}, /*18*/ + {69.5, 2.0, PathPointTypeLine, 0, 1}, /*19*/ + {85.5, 7.3, PathPointTypeLine, 0, 1}, /*20*/ + {91.5, 11.0, PathPointTypeLine, 0, 1}, /*21*/ + {96.0, 15.3, PathPointTypeLine, 0, 1}, /*22*/ + {99.0, 20.0, PathPointTypeLine, 0, 1}, /*23*/ + {100.0,25.0, PathPointTypeLine | PathPointTypeCloseSubpath, 0, 1} /*24*/ + }; + +static path_test_t flattenarc_path[] = { + {100.0, 25.0,PathPointTypeStart, 0, 0}, /*0*/ + {99.0, 30.0, PathPointTypeLine, 0, 1}, /*1*/ + {96.0, 34.8, PathPointTypeLine, 0, 1}, /*2*/ + {91.5, 39.0, PathPointTypeLine, 0, 1}, /*3*/ + {85.5, 42.8, PathPointTypeLine, 0, 1}, /*4*/ + {69.5, 48.0, PathPointTypeLine, 0, 1}, /*5*/ + {50.0, 50.0, PathPointTypeLine, 0, 1} /*6*/ + }; + +static void test_flatten(void) +{ + GpStatus status; + GpPath *path; + GpMatrix *m; + + status = GdipCreatePath(FillModeAlternate, &path); + expect(Ok, status); + status = GdipCreateMatrix(&m); + expect(Ok, status); + + /* NULL arguments */ + status = GdipFlattenPath(NULL, NULL, 0.0); + expect(InvalidParameter, status); + status = GdipFlattenPath(NULL, m, 0.0); + expect(InvalidParameter, status); + + status = GdipAddPathEllipse(path, 0.0, 0.0, 100.0, 50.0); + expect(Ok, status); + + status = GdipFlattenPath(path, NULL, 1.0); + todo_wine expect(Ok, status); + ok_path(path, flattenellipse_path, sizeof(flattenellipse_path)/sizeof(path_test_t), TRUE); + + status = GdipResetPath(path); + expect(Ok, status); + status = GdipAddPathArc(path, 0.0, 0.0, 100.0, 50.0, 0.0, 90.0); + expect(Ok, status); + status = GdipFlattenPath(path, NULL, 1.0); + todo_wine expect(Ok, status); + ok_path(path, flattenarc_path, sizeof(flattenarc_path)/sizeof(path_test_t), TRUE); + + GdipDeleteMatrix(m); + GdipDeletePath(path); +} + START_TEST(graphicspath) { struct GdiplusStartupInput gdiplusStartupInput; @@ -913,6 +987,7 @@ START_TEST(graphicspath) test_addclosedcurve(); test_reverse(); test_addpie(); + test_flatten(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/pathiterator.c b/dlls/gdiplus/tests/pathiterator.c index 6995b189699..79ce879238d 100644 --- a/dlls/gdiplus/tests/pathiterator.c +++ b/dlls/gdiplus/tests/pathiterator.c @@ -476,6 +476,34 @@ static void test_nextsubpath(void) GdipDeletePath(path); } +static void test_nextpathtype(void) +{ + GpPath *path; + GpPathIterator *iter; + GpStatus stat; + INT start, end, result; + BYTE type; + + GdipCreatePath(FillModeAlternate, &path); + GdipCreatePathIter(&iter, path); + + /* NULL arguments */ + stat = GdipPathIterNextPathType(NULL, NULL, NULL, NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipPathIterNextPathType(iter, NULL, NULL, NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipPathIterNextPathType(iter, &result, NULL, NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipPathIterNextPathType(iter, NULL, &type, NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipPathIterNextPathType(iter, NULL, NULL, &start, &end); + expect(InvalidParameter, stat); + stat = GdipPathIterNextPathType(iter, NULL, &type, &start, &end); + expect(InvalidParameter, stat); + + GdipDeletePath(path); +} + START_TEST(pathiterator) { struct GdiplusStartupInput gdiplusStartupInput; @@ -496,6 +524,7 @@ START_TEST(pathiterator) test_isvalid(); test_nextsubpathpath(); test_nextsubpath(); + test_nextpathtype(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c index b207f3f579b..63d00868c76 100644 --- a/dlls/gdiplus/tests/region.c +++ b/dlls/gdiplus/tests/region.c @@ -35,10 +35,7 @@ #define expect_magic(value) ok(*value == RGNDATA_MAGIC || *value == RGNDATA_MAGIC2, "Expected a known magic value, got %8x\n", *value) -static inline void expect_dword(DWORD *value, DWORD expected) -{ - ok(*value == expected, "expected %08x got %08x\n", expected, *value); -} +#define expect_dword(value, expected) ok(*(value) == expected, "expected %08x got %08x\n", expected, *(value)) static inline void expect_float(DWORD *value, FLOAT expected) { @@ -506,9 +503,154 @@ static void test_isinfinite(void) GdipDeleteMatrix(m); GdipDeleteRegion(region); + GdipDeleteGraphics(graphics); + ReleaseDC(0, hdc); +} + +static void test_isempty(void) +{ + GpStatus status; + GpRegion *region; + GpGraphics *graphics = NULL; + HDC hdc = GetDC(0); + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + GdipCreateRegion(®ion); + + /* NULL arguments */ + status = GdipIsEmptyRegion(NULL, NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsEmptyRegion(region, NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsEmptyRegion(NULL, graphics, NULL); + expect(InvalidParameter, status); + status = GdipIsEmptyRegion(NULL, NULL, &res); + expect(InvalidParameter, status); + status = GdipIsEmptyRegion(region, NULL, &res); + expect(InvalidParameter, status); + + /* default is infinite */ + res = TRUE; + status = GdipIsEmptyRegion(region, graphics, &res); + expect(Ok, status); + expect(FALSE, res); + + status = GdipSetEmpty(region); + expect(Ok, status); + + res = FALSE; + status = GdipIsEmptyRegion(region, graphics, &res); + expect(Ok, status); + expect(TRUE, res); + + GdipDeleteRegion(region); + GdipDeleteGraphics(graphics); ReleaseDC(0, hdc); } +static void test_combinereplace(void) +{ + GpStatus status; + GpRegion *region, *region2; + GpPath *path; + GpRectF rectf; + UINT needed; + DWORD buf[50]; + + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + + status = GdipCreateRegionRect(&rectf, ®ion); + expect(Ok, status); + + /* replace with the same rectangle */ + status = GdipCombineRegionRect(region, &rectf,CombineModeReplace); + expect(Ok, status); + + status = GdipGetRegionDataSize(region, &needed); + expect(Ok, status); + expect(36, needed); + status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); + expect(Ok, status); + expect(36, needed); + expect_dword(buf, 28); + trace("buf[1] = %08x\n", buf[1]); + expect_magic((DWORD*)(buf + 2)); + expect_dword(buf + 3, 0); + expect_dword(buf + 4, RGNDATA_RECT); + + /* replace with path */ + status = GdipCreatePath(FillModeAlternate, &path); + expect(Ok, status); + status = GdipAddPathEllipse(path, 0.0, 0.0, 100.0, 250.0); + expect(Ok, status); + status = GdipCombineRegionPath(region, path, CombineModeReplace); + expect(Ok, status); + + status = GdipGetRegionDataSize(region, &needed); + expect(Ok, status); + expect(156, needed); + status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); + expect(Ok, status); + expect(156, needed); + expect_dword(buf, 148); + trace("buf[1] = %08x\n", buf[1]); + expect_magic((DWORD*)(buf + 2)); + expect_dword(buf + 3, 0); + expect_dword(buf + 4, RGNDATA_PATH); + GdipDeletePath(path); + + /* replace with infinite rect */ + status = GdipCreateRegion(®ion2); + expect(Ok, status); + status = GdipCombineRegionRegion(region, region2, CombineModeReplace); + expect(Ok, status); + + status = GdipGetRegionDataSize(region, &needed); + expect(Ok, status); + expect(20, needed); + status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); + expect(Ok, status); + expect(20, needed); + expect_dword(buf, 12); + trace("buf[1] = %08x\n", buf[1]); + expect_magic((DWORD*)(buf + 2)); + expect_dword(buf + 3, 0); + expect_dword(buf + 4, RGNDATA_INFINITE_RECT); + GdipDeletePath(path); + GdipDeleteRegion(region2); + + /* more complex case : replace with a combined region */ + status = GdipCreateRegionRect(&rectf, ®ion2); + expect(Ok, status); + status = GdipCreatePath(FillModeAlternate, &path); + expect(Ok, status); + status = GdipAddPathEllipse(path, 0.0, 0.0, 100.0, 250.0); + expect(Ok, status); + status = GdipCombineRegionPath(region2, path, CombineModeUnion); + expect(Ok, status); + GdipDeletePath(path); + status = GdipCombineRegionRegion(region, region2, CombineModeReplace); + expect(Ok, status); + GdipDeleteRegion(region2); + + status = GdipGetRegionDataSize(region, &needed); + expect(Ok, status); + expect(180, needed); + status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); + expect(Ok, status); + expect(180, needed); + expect_dword(buf, 172); + trace("buf[1] = %08x\n", buf[1]); + expect_magic((DWORD*)(buf + 2)); + expect_dword(buf + 3, 2); + expect_dword(buf + 4, CombineModeUnion); + + GdipDeleteRegion(region); +} + START_TEST(region) { struct GdiplusStartupInput gdiplusStartupInput; @@ -523,6 +665,8 @@ START_TEST(region) test_getregiondata(); test_isinfinite(); + test_isempty(); + test_combinereplace(); GdiplusShutdown(gdiplusToken); diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 430a943e400..a2ec4b2f60d 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -632,7 +632,7 @@ DWORD WINAPI FlushIpNetTable(DWORD dwIfIndex) DWORD WINAPI GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex) { char adapterName[MAX_ADAPTER_NAME]; - int i; + unsigned int i; DWORD ret; TRACE("(AdapterName %p, IfIndex %p)\n", AdapterName, IfIndex); diff --git a/dlls/jscript/jscript_main.c b/dlls/jscript/jscript_main.c index 92999fbc680..7cb46bfc489 100644 --- a/dlls/jscript/jscript_main.c +++ b/dlls/jscript/jscript_main.c @@ -161,7 +161,7 @@ static HRESULT register_inf(BOOL doregister) STRTABLEA strtable; STRENTRYA pse[7]; static CLSID const *clsids[7]; - int i = 0; + unsigned int i = 0; static const WCHAR advpackW[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index 7ea89a2178c..c7daf19524b 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -241,7 +241,9 @@ static void test_string_conversion(LPBOOL bUsedDefaultChar) ok(ret == 1, "ret is %d\n", ret); ok(mbc == -16, "mbc is %d\n", mbc); if(bUsedDefaultChar) ok(*bUsedDefaultChar == FALSE, "bUsedDefaultChar is %d\n", *bUsedDefaultChar); - ok(GetLastError() == 0xdeadbeef, "GetLastError() is %u\n", GetLastError()); + ok(GetLastError() == 0xdeadbeef || + broken(GetLastError() == 0), /* win95 */ + "GetLastError() is %u\n", GetLastError()); SetLastError(0xdeadbeef); ret = WideCharToMultiByte(1251, 0, &wc1, 1, &mbc, 1, NULL, bUsedDefaultChar); diff --git a/dlls/kernel32/tests/environ.c b/dlls/kernel32/tests/environ.c index e6dd1fca5d3..ad3734f26ba 100644 --- a/dlls/kernel32/tests/environ.c +++ b/dlls/kernel32/tests/environ.c @@ -24,6 +24,13 @@ #include "windef.h" #include "winbase.h" #include "winerror.h" +#include "winnls.h" + +static CHAR string[MAX_PATH]; +#define ok_w(res, format, szString) \ +\ + WideCharToMultiByte(CP_ACP, 0, szString, -1, string, MAX_PATH, NULL, NULL); \ + ok(res, format, string); static BOOL (WINAPI *pGetComputerNameExA)(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); static BOOL (WINAPI *pGetComputerNameExW)(COMPUTER_NAME_FORMAT,LPWSTR,LPDWORD); @@ -156,7 +163,7 @@ static void test_GetSetEnvironmentVariableW(void) lstrcpyW(buf, fooW); ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value)); - ok(lstrcmpW(buf, fooW) == 0, "should not touch the buffer\n"); + ok_w(lstrcmpW(buf, fooW) == 0, "should not touch the buffer: %s\n", buf); ok(ret_size == lstrlenW(value) + 1, "should return length with terminating 0 ret_size=%d\n", ret_size); diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c index f524be70d56..ca31aaf014b 100644 --- a/dlls/kernel32/tests/module.c +++ b/dlls/kernel32/tests/module.c @@ -216,6 +216,111 @@ static void testGetProcAddress_Wrong(void) "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_HANDLE(win9x), got %d\n", GetLastError()); } +static void testLoadLibraryEx(void) +{ + CHAR path[MAX_PATH]; + HMODULE hmodule; + HANDLE hfile; + + hfile = CreateFileA("testfile.dll", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + ok(hfile != INVALID_HANDLE_VALUE, "Expected a valid file handle\n"); + + /* NULL lpFileName */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA(NULL, NULL, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + ok(GetLastError() == ERROR_MOD_NOT_FOUND, + "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError()); + + /* empty lpFileName */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("", NULL, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + ok(GetLastError() == ERROR_MOD_NOT_FOUND, + "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError()); + + /* hFile is non-NULL */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("testfile.dll", hfile, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + todo_wine + { + ok(GetLastError() == ERROR_SHARING_VIOLATION, + "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); + } + + /* has nothing to do with hFile */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("testfile.dll", NULL, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + todo_wine + { + ok(GetLastError() == ERROR_SHARING_VIOLATION, + "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); + } + + /* one last try with hFile */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA(NULL, hfile, 0); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + ok(GetLastError() == ERROR_MOD_NOT_FOUND, + "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError()); + + CloseHandle(hfile); + + /* load empty file */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("testfile.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + todo_wine + { + ok(GetLastError() == ERROR_FILE_INVALID, + "Expected ERROR_FILE_INVALID, got %d\n", GetLastError()); + } + + DeleteFileA("testfile.dll"); + + GetSystemDirectoryA(path, MAX_PATH); + if (path[lstrlenA(path) - 1] != '\\') + lstrcatA(path, "\\"); + lstrcatA(path, "kernel32.dll"); + + /* load kernel32.dll with an absolute path */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE); + ok(hmodule != 0, "Expected valid module handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected 0xdeadbeef, got %d\n", GetLastError()); + + CloseHandle(hmodule); + + /* load kernel32.dll with no path */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA("kernel32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); + ok(hmodule != 0, "Expected valid module handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected 0xdeadbeef, got %d\n", GetLastError()); + + CloseHandle(hmodule); + + GetCurrentDirectoryA(MAX_PATH, path); + if (path[lstrlenA(path) - 1] != '\\') + lstrcatA(path, "\\"); + lstrcatA(path, "kernel32.dll"); + + /* load kernel32.dll with an absolute path that does not exist */ + SetLastError(0xdeadbeef); + hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE); + todo_wine + { + ok(hmodule == 0, "Expected 0, got %p\n", hmodule); + } + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); +} + START_TEST(module) { WCHAR filenameW[MAX_PATH]; @@ -238,4 +343,5 @@ START_TEST(module) testNestedLoadLibraryA(); testLoadLibraryA_Wrong(); testGetProcAddress_Wrong(); + testLoadLibraryEx(); } diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 8443879129d..3e9e0e726ff 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -1180,13 +1180,15 @@ static void test_Console(void) /* Try to set invalid CP */ SetLastError(0xdeadbeef); ok(!SetConsoleCP(0), "Shouldn't succeed\n"); - ok(GetLastError()==ERROR_INVALID_PARAMETER, + ok(GetLastError()==ERROR_INVALID_PARAMETER || + broken(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), /* win95 */ "GetLastError: expecting %u got %u\n", ERROR_INVALID_PARAMETER, GetLastError()); SetLastError(0xdeadbeef); ok(!SetConsoleOutputCP(0), "Shouldn't succeed\n"); - ok(GetLastError()==ERROR_INVALID_PARAMETER, + ok(GetLastError()==ERROR_INVALID_PARAMETER || + broken(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), /* win95 */ "GetLastError: expecting %u got %u\n", ERROR_INVALID_PARAMETER, GetLastError()); diff --git a/dlls/kernel32/tests/resource.c b/dlls/kernel32/tests/resource.c index 79d17f13fae..9f8dcce241f 100644 --- a/dlls/kernel32/tests/resource.c +++ b/dlls/kernel32/tests/resource.c @@ -185,10 +185,10 @@ static void update_resources_version(void) MAKEINTRESOURCE(0x4567), 0xabcd, foo, sizeof foo ); - ok( r == TRUE, "UpdateResource failed\n"); + ok( r == TRUE, "UpdateResource failed: %d\n", GetLastError()); r = EndUpdateResource( res, FALSE ); - ok( r, "EndUpdateResource failed\n"); + ok( r, "EndUpdateResource failed: %d\n", GetLastError()); } diff --git a/dlls/lz32/tests/lzexpand_main.c b/dlls/lz32/tests/lzexpand_main.c index a296b28e630..07cfe5fbd4f 100644 --- a/dlls/lz32/tests/lzexpand_main.c +++ b/dlls/lz32/tests/lzexpand_main.c @@ -230,7 +230,8 @@ static void test_LZOpenFileA_existing_compressed(void) /* d, using underscore-terminated file name. */ file = LZOpenFileA(_terminated, &test, OF_EXIST); ok(file >= 0, "LZOpenFileA failed on switching to a compressed file name\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -388,7 +389,8 @@ static void test_LZOpenFileA(void) /* a, for reading. */ file = LZOpenFileA(filename_, &test, OF_READ); ok(file >= 0, "LZOpenFileA failed on read\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -403,7 +405,8 @@ static void test_LZOpenFileA(void) /* b, for writing. */ file = LZOpenFileA(filename_, &test, OF_WRITE); ok(file >= 0, "LZOpenFileA failed on write\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -418,7 +421,8 @@ static void test_LZOpenFileA(void) /* c, for reading and writing. */ file = LZOpenFileA(filename_, &test, OF_READWRITE); ok(file >= 0, "LZOpenFileA failed on read/write\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -433,7 +437,8 @@ static void test_LZOpenFileA(void) /* d, for checking file existence. */ file = LZOpenFileA(filename_, &test, OF_EXIST); ok(file >= 0, "LZOpenFileA failed on read/write\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -448,7 +453,8 @@ static void test_LZOpenFileA(void) /* Delete the file then make sure it doesn't exist anymore. */ file = LZOpenFileA(filename_, &test, OF_DELETE); ok(file >= 0, "LZOpenFileA failed on delete\n"); - ok(test.cBytes == sizeof(OFSTRUCT), + ok(test.cBytes == sizeof(OFSTRUCT) || + broken(test.cBytes == 40), /* win95 */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); diff --git a/dlls/msi/source.c b/dlls/msi/source.c index d416f0f7850..5a714b12714 100644 --- a/dlls/msi/source.c +++ b/dlls/msi/source.c @@ -208,9 +208,10 @@ UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode, LPWSTR szDiskPrompt, LPDWORD pcchDiskPrompt) { WCHAR squished_pc[GUID_SIZE]; + WCHAR convert[11]; LPWSTR value = NULL; LPWSTR data = NULL; - LPWSTR ptr; + LPWSTR ptr, ptr2; HKEY source, media; DWORD valuesz, datasz = 0; DWORD type; @@ -219,6 +220,8 @@ UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode, UINT r; static int index = 0; + static const WCHAR fmt[] = {'#','%','d',0}; + TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p)\n", debugstr_w(szProductCodeOrPatchCode), debugstr_w(szUserSid), dwContext, dwOptions, dwIndex, szVolumeLabel, pcchVolumeLabel, szDiskPrompt, pcchDiskPrompt); @@ -285,6 +288,7 @@ UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode, if (pdwDiskId) *pdwDiskId = atolW(value); + ptr2 = data; ptr = strchrW(data, ';'); if (!ptr) ptr = data; @@ -293,11 +297,19 @@ UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode, if (pcchVolumeLabel) { - size = lstrlenW(data); + if (type == REG_DWORD) + { + sprintfW(convert, fmt, *data); + size = lstrlenW(convert); + ptr2 = convert; + } + else + size = lstrlenW(data); + if (size >= *pcchVolumeLabel) r = ERROR_MORE_DATA; else if (szVolumeLabel) - lstrcpyW(szVolumeLabel, data); + lstrcpyW(szVolumeLabel, ptr2); *pcchVolumeLabel = size; } @@ -307,6 +319,15 @@ UINT WINAPI MsiSourceListEnumMediaDisksW(LPCWSTR szProductCodeOrPatchCode, if (!*ptr) ptr++; + if (type == REG_DWORD) + { + sprintfW(convert, fmt, *ptr); + size = lstrlenW(convert); + ptr = convert; + } + else + size = lstrlenW(ptr); + size = lstrlenW(ptr); if (size >= *pcchDiskPrompt) r = ERROR_MORE_DATA; diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c index 683de7a3178..8ea639af562 100644 --- a/dlls/msi/tests/automation.c +++ b/dlls/msi/tests/automation.c @@ -63,8 +63,7 @@ static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttribu "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n" "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n" "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n" - "component\t\tMSITESTDIR\t0\t1\tfile\n" - "service_comp\t\tMSITESTDIR\t0\t1\tservice_file"; + "component\t\tMSITESTDIR\t0\t1\tfile\n"; static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" "s72\tS72\tl255\n" @@ -85,8 +84,7 @@ static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\t "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n" "Three\tOne\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n" "Two\tOne\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n" - "feature\t\t\t\t2\t1\tTARGETDIR\t0\n" - "service_feature\t\t\t\t2\t1\tTARGETDIR\t0"; + "feature\t\t\t\t2\t1\tTARGETDIR\t0\n"; static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n" "s38\ts72\n" @@ -96,8 +94,7 @@ static const CHAR feature_comp_dat[] = "Feature_\tComponent_\n" "One\tOne\n" "Three\tThree\n" "Two\tTwo\n" - "feature\tcomponent\n" - "service_feature\tservice_comp\n"; + "feature\tcomponent\n"; static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" @@ -107,8 +104,7 @@ static const CHAR file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tL "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n" "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n" "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n" - "file\tcomponent\tfilename\t100\t\t\t8192\t1\n" - "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1"; + "file\tcomponent\tfilename\t100\t\t\t8192\t1\n"; static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "s72\tS255\tI2\n" @@ -118,7 +114,6 @@ static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "CostInitialize\t\t800\n" "FileCost\t\t900\n" "InstallFiles\t\t4000\n" - "InstallServices\t\t5000\n" "RegisterProduct\t\t6100\n" "PublishProduct\t\t6400\n" "InstallFinalize\t\t6600\n" @@ -158,17 +153,6 @@ static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_ "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; -static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" - "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n" - "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n" - "ServiceInstall\tServiceInstall\n" - "TestService\tTestService\tTestService\t2\t3\t0\t\t\tTestService\t\t\tservice_comp\t\t"; - -static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" - "s72\tl255\ti2\tL255\tI2\ts72\n" - "ServiceControl\tServiceControl\n" - "ServiceControl\tTestService\t8\t\t0\tservice_comp"; - typedef struct _msi_table { const CHAR *filename; @@ -188,9 +172,7 @@ static const msi_table tables[] = ADD_TABLE(install_exec_seq), ADD_TABLE(media), ADD_TABLE(property), - ADD_TABLE(registry), - ADD_TABLE(service_install), - ADD_TABLE(service_control) + ADD_TABLE(registry) }; typedef struct _msi_summary_info @@ -343,7 +325,6 @@ static void create_test_files(void) CreateDirectoryA("msitest\\cabout\\new",NULL); create_file("msitest\\cabout\\new\\five.txt", 100); create_file("msitest\\filename", 100); - create_file("msitest\\service.exe", 100); } static BOOL delete_pf(const CHAR *rel_path, BOOL is_file) @@ -368,7 +349,6 @@ static void delete_test_files(void) DeleteFileA("msitest\\second\\three.txt"); DeleteFileA("msitest\\first\\two.txt"); DeleteFileA("msitest\\one.txt"); - DeleteFileA("msitest\\service.exe"); DeleteFileA("msitest\\filename"); RemoveDirectoryA("msitest\\cabout\\new"); RemoveDirectoryA("msitest\\cabout"); @@ -377,24 +357,6 @@ static void delete_test_files(void) RemoveDirectoryA("msitest"); } -static void check_service_is_installed(void) -{ - SC_HANDLE scm, service; - BOOL res; - - scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - ok(scm != NULL, "Failed to open the SC Manager\n"); - - service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS); - ok(service != NULL, "Failed to open TestService\n"); - - res = DeleteService(service); - ok(res, "Failed to delete TestService\n"); - - CloseServiceHandle(service); - CloseServiceHandle(scm); -} - /* * Automation helpers and tests */ @@ -2272,7 +2234,6 @@ static void test_Installer_InstallProduct(void) ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); @@ -2306,8 +2267,6 @@ static void test_Installer_InstallProduct(void) res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - check_service_is_installed(); - /* Remove registry keys written by RegisterProduct standard action */ res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index ec299ead904..3775cbd4509 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -7869,6 +7869,165 @@ static void test_access(void) DeleteFileA(msifile); } +static void test_emptypackage(void) +{ + MSIHANDLE hpkg, hdb, hsuminfo; + MSIHANDLE hview, hrec; + MSICONDITION condition; + CHAR buffer[MAX_PATH]; + DWORD size; + UINT r; + + r = MsiOpenPackageA("", &hpkg); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + hdb = MsiGetActiveDatabase(hpkg); + todo_wine + { + ok(hdb != 0, "Expected a valid database handle\n"); + } + + r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Tables`", &hview); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + r = MsiViewExecute(hview, 0); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + r = MsiViewFetch(hview, &hrec); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + size = MAX_PATH; + r = MsiRecordGetString(hrec, 1, buffer, &size); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buffer, "_Property"), + "Expected \"_Property\", got \"%s\"\n", buffer); + } + + MsiCloseHandle(hrec); + + r = MsiViewFetch(hview, &hrec); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + size = MAX_PATH; + r = MsiRecordGetString(hrec, 1, buffer, &size); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buffer, "#_FolderCache"), + "Expected \"_Property\", got \"%s\"\n", buffer); + } + + MsiCloseHandle(hrec); + MsiViewClose(hview); + MsiCloseHandle(hview); + + condition = MsiDatabaseIsTablePersistentA(hdb, "_Property"); + todo_wine + { + ok(condition == MSICONDITION_FALSE, + "Expected MSICONDITION_FALSE, got %d\n", condition); + } + + r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Property`", &hview); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + r = MsiViewExecute(hview, 0); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + /* _Property table is not empty */ + r = MsiViewFetch(hview, &hrec); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + MsiCloseHandle(hrec); + MsiViewClose(hview); + MsiCloseHandle(hview); + + condition = MsiDatabaseIsTablePersistentA(hdb, "#_FolderCache"); + todo_wine + { + ok(condition == MSICONDITION_FALSE, + "Expected MSICONDITION_FALSE, got %d\n", condition); + } + + r = MsiDatabaseOpenView(hdb, "SELECT * FROM `#_FolderCache`", &hview); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + r = MsiViewExecute(hview, 0); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + /* #_FolderCache is not empty */ + r = MsiViewFetch(hview, &hrec); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + MsiCloseHandle(hrec); + MsiViewClose(hview); + MsiCloseHandle(hview); + + r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Streams`", &hview); + todo_wine + { + ok(r == ERROR_BAD_QUERY_SYNTAX, + "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + } + + r = MsiDatabaseOpenView(hdb, "SELECT * FROM `_Storages`", &hview); + todo_wine + { + ok(r == ERROR_BAD_QUERY_SYNTAX, + "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + } + + r = MsiGetSummaryInformationA(hdb, NULL, 0, &hsuminfo); + todo_wine + { + ok(r == ERROR_INSTALL_PACKAGE_INVALID, + "Expected ERROR_INSTALL_PACKAGE_INVALID, got %d\n", r); + } + + MsiCloseHandle(hsuminfo); + + r = MsiDatabaseCommit(hdb); + todo_wine + { + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + } + + MsiCloseHandle(hdb); + MsiCloseHandle(hpkg); +} + START_TEST(package) { GetCurrentDirectoryA(MAX_PATH, CURR_DIR); @@ -7895,4 +8054,5 @@ START_TEST(package) test_shortlongsource(); test_sourcedir(); test_access(); + test_emptypackage(); } diff --git a/dlls/msi/tests/source.c b/dlls/msi/tests/source.c index 148ea40382c..30b5be03710 100644 --- a/dlls/msi/tests/source.c +++ b/dlls/msi/tests/source.c @@ -2864,13 +2864,10 @@ static void test_MsiSourceListEnumMediaDisks(void) prompt, &promptsz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(id == 1, "Expected 1, got %d\n", id); - todo_wine - { - ok(!lstrcmpA(label, "#42"), "Expected \"#42\", got \"%s\"\n", label); - ok(labelsz == 3, "Expected 3, got %d\n", labelsz); - ok(!lstrcmpA(prompt, "#42"), "Expected \"#42\", got \"%s\"\n", prompt); - ok(promptsz == 3, "Expected 3, got %d\n", promptsz); - } + ok(!lstrcmpA(label, "#42"), "Expected \"#42\", got \"%s\"\n", label); + ok(labelsz == 3, "Expected 3, got %d\n", labelsz); + ok(!lstrcmpA(prompt, "#42"), "Expected \"#42\", got \"%s\"\n", prompt); + ok(promptsz == 3, "Expected 3, got %d\n", promptsz); RegDeleteValueA(media, "1"); RegDeleteValueA(media, "2"); diff --git a/dlls/mstask/tests/task.c b/dlls/mstask/tests/task.c index a5f2d0ae1d0..820b962948f 100644 --- a/dlls/mstask/tests/task.c +++ b/dlls/mstask/tests/task.c @@ -448,7 +448,14 @@ static void test_SetAccountInformation_GetAccountInformation(void) /* Get account information before it is set */ hres = ITask_GetAccountInformation(test_task, &account_name); /* WinXP returns HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): 0x80070002 but - * Win2K returns SCHED_E_CANNOT_OPEN_TASK: 0x8004130d */ + * Win2K returns SCHED_E_CANNOT_OPEN_TASK: 0x8004130d + * Win9x doesn't support security services */ + if (hres == SCHED_E_NO_SECURITY_SERVICES) + { + win_skip("Security services are not supported\n"); + cleanup_task(); + return; + } ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || hres == SCHED_E_CANNOT_OPEN_TASK, "Unset account name generated: 0x%08x\n", hres); diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index b449af547ea..25ac69f9719 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -57,7 +57,12 @@ static MSVCRT_matherr_func MSVCRT_default_matherr_func = NULL; double CDECL MSVCRT_acos( double x ) { if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return acos(x); + /* glibc implements acos() as the FPU equivalent of atan2(sqrt(1 - x ^ 2), x). + * asin() uses a similar construction. This is bad because as x gets nearer to + * 1 the error in the expression "1 - x^2" can get relatively large due to + * cancellation. The sqrt() makes things worse. A safer way to calculate + * acos() is to use atan2(sqrt((1 - x) * (1 + x)), x). */ + return atan2(sqrt((1 - x) * (1 + x)), x); } /********************************************************************* @@ -66,7 +71,7 @@ double CDECL MSVCRT_acos( double x ) double CDECL MSVCRT_asin( double x ) { if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM; - return asin(x); + return atan2(x, sqrt((1 - x) * (1 + x))); } /********************************************************************* diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 45ffdcef960..0cf13fde969 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -1085,6 +1085,19 @@ static void test_pipes(const char* selfname) ok(fclose(file) == 0, "unable to close the pipe: %d\n", errno); } +static void test_unlink(void) +{ + FILE* file; + ok(mkdir("test_unlink") == 0, "unable to create test dir\n"); + file = fopen("test_unlink\\empty", "w"); + ok(file != NULL, "unable to create test file\n"); + if(file) + fclose(file); + todo_wine ok(_unlink("test_unlink") != 0, "unlinking a non-empty directory must fail\n"); + unlink("test_unlink\\empty"); + rmdir("test_unlink"); +} + START_TEST(file) { int arg_c; @@ -1109,6 +1122,7 @@ START_TEST(file) test_file_write_read(); test_chsize(); test_stat(); + test_unlink(); /* testing stream I/O */ test_fdopen(); diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c index 4156c78a4a7..438cf48b077 100644 --- a/dlls/msxml3/dispex.c +++ b/dlls/msxml3/dispex.c @@ -542,42 +542,42 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex); - return S_OK; + TRACE("Not implemented in native msxml3 (%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex); + return E_NOTIMPL; } static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%x)\n", This, id); + TRACE("Not implemented in native msxml3 (%p)->(%x)\n", This, id); return E_NOTIMPL; } static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex); + TRACE("Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex); return E_NOTIMPL; } static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%x %p)\n", This, id, pbstrName); + TRACE("Not implemented in native msxml3 (%p)->(%x %p)\n", This, id, pbstrName); return E_NOTIMPL; } static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%x %x %p)\n", This, grfdex, id, pid); + TRACE(" Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, grfdex, id, pid); return E_NOTIMPL; } static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%p)\n", This, ppunk); + TRACE("Not implemented in native msxml3 (%p)->(%p)\n", This, ppunk); return E_NOTIMPL; } diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index ef62c9f7840..554b048ba96 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -1272,10 +1272,10 @@ void libxmlFatalError(void *ctx, const char *msg, ...) vsprintf(message, msg, args); va_end(args); - len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0); + len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0); wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len); if(wszError) - MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len); + MultiByteToWideChar(CP_UNIXCP, 0, message, -1, (LPWSTR)wszError, len); if(This->vbInterface) { diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 8a48882ad4b..8af6b02dda1 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -26,6 +26,7 @@ #include "ole2.h" #include "xmldom.h" #include "msxml2.h" +#include "msxml2did.h" #include "dispex.h" #include #include @@ -1544,7 +1545,39 @@ static void test_getElementsByTagName(void) r = IXMLDOMNodeList_QueryInterface( node_list, &IID_IDispatchEx, (void**)&dispex ); ok( r == S_OK, "rets %08x\n", r); if( r == S_OK ) + { + DISPID dispid = DISPID_XMLDOM_NODELIST_RESET; + DWORD dwProps = 0; + BSTR sName; + IUnknown *pUnk; + + sName = SysAllocString( szstar ); + r = IDispatchEx_DeleteMemberByName(dispex, sName, fdexNameCaseSensitive); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + SysFreeString( sName ); + + r = IDispatchEx_DeleteMemberByDispID(dispex, dispid); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + + r = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &dwProps); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + ok(dwProps == 0, "expected 0 got %d\n", dwProps); + + r = IDispatchEx_GetMemberName(dispex, dispid, &sName); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + if(sName) + SysFreeString(sName); + + r = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_NODELIST_RESET, &dispid); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + + r = IDispatchEx_GetNameSpaceParent(dispex, &pUnk); + ok(r == E_NOTIMPL, "expected E_NOTIMPL got %08x\n", r); + if(r == S_OK) + IUnknown_Release(pUnk); + IDispatchEx_Release( dispex ); + } IXMLDOMNodeList_Release( node_list ); diff --git a/dlls/netapi32/tests/access.c b/dlls/netapi32/tests/access.c index f46cb7faf00..f8536a72fbf 100644 --- a/dlls/netapi32/tests/access.c +++ b/dlls/netapi32/tests/access.c @@ -217,7 +217,7 @@ static void run_querydisplayinformation1_tests(void) pNetApiBufferFree(Buffer); } while (Result == ERROR_MORE_DATA); - ok(hasAdmin, "Has Administrator account\n"); + ok(hasAdmin, "Doesn't have 'Administrator' account\n"); } static void run_usermodalsget_tests(void) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index d7f5b938efd..57460234a9e 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -45,6 +45,9 @@ #ifdef HAVE_SYS_IOCTL_H #include #endif +#ifdef HAVE_SYS_FILIO_H +# include +#endif #ifdef HAVE_POLL_H #include #endif diff --git a/dlls/ntdll/tests/env.c b/dlls/ntdll/tests/env.c index 0480e7a6686..aab93684187 100644 --- a/dlls/ntdll/tests/env.c +++ b/dlls/ntdll/tests/env.c @@ -155,7 +155,9 @@ static void testSetHelper(LPWSTR* env, const char* var, const char* val, NTSTATU ok(lstrcmpW(bval1, bval2) == 0, "Cannot get value written to environment\n"); break; case STATUS_VARIABLE_NOT_FOUND: - ok(val == NULL, "Couldn't find variable, but didn't delete it. val = %s\n", val); + ok(val == NULL || + broken(strchr(var,'=') != NULL), /* variable containing '=' may be set but not found again on NT4 */ + "Couldn't find variable, but didn't delete it. val = %s\n", val); break; default: ok(0, "Wrong ret %u for %s\n", nts, var); @@ -178,7 +180,7 @@ static void testSet(void) testSetHelper(&env, "cat", NULL, STATUS_SUCCESS, 0); testSetHelper(&env, "cat", NULL, STATUS_SUCCESS, STATUS_VARIABLE_NOT_FOUND); testSetHelper(&env, "foo", "meouw", STATUS_SUCCESS, 0); - testSetHelper(&env, "me=too", "also", STATUS_INVALID_PARAMETER, 0); + testSetHelper(&env, "me=too", "also", STATUS_SUCCESS, STATUS_INVALID_PARAMETER); testSetHelper(&env, "me", "too=also", STATUS_SUCCESS, 0); testSetHelper(&env, "=too", "also", STATUS_SUCCESS, 0); testSetHelper(&env, "=", "also", STATUS_SUCCESS, 0); diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 4a0b017ff83..74f180e29d8 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -358,7 +358,8 @@ static void test_query_procperf(void) /* A too large given buffer size */ sppi = HeapReAlloc(GetProcessHeap(), 0, sppi , NeededLength + 2); status = pNtQuerySystemInformation(SystemProcessorPerformanceInformation, sppi, NeededLength + 2, &ReturnLength); - ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); + ok( status == STATUS_SUCCESS || status == STATUS_INFO_LENGTH_MISMATCH /* vista */, + "Expected STATUS_SUCCESS or STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); ok( NeededLength == ReturnLength, "Inconsistent length (%d) <-> (%d)\n", NeededLength, ReturnLength); HeapFree( GetProcessHeap(), 0, sppi); @@ -407,12 +408,10 @@ static void test_query_handle(void) SYSTEM_HANDLE_INFORMATION* shi = HeapAlloc(GetProcessHeap(), 0, SystemInformationLength); /* Request the needed length : a SystemInformationLength greater than one struct sets ReturnLength */ - status = pNtQuerySystemInformation(SystemHandleInformation, shi, 0, &ReturnLength); - - ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); - ok( ReturnLength > 0, "Expected ReturnLength to be > 0, it was %d\n", ReturnLength); + status = pNtQuerySystemInformation(SystemHandleInformation, shi, SystemInformationLength, &ReturnLength); + todo_wine ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); - SystemInformationLength = ReturnLength + sizeof(HANDLE); + SystemInformationLength = ReturnLength; shi = HeapReAlloc(GetProcessHeap(), 0, shi , SystemInformationLength); status = pNtQuerySystemInformation(SystemHandleInformation, shi, SystemInformationLength, &ReturnLength); if (status != STATUS_INFO_LENGTH_MISMATCH) /* vista */ @@ -822,7 +821,7 @@ static void test_readvirtualmemory(void) /* illegal remote address */ todo_wine{ status = pNtReadVirtualMemory(process, (void *) 0x1234, buffer, 12, &readcount); - ok( status == STATUS_PARTIAL_COPY, "Expected STATUS_PARTIAL_COPY, got %08x\n", status); + ok( status == STATUS_PARTIAL_COPY || broken(status == STATUS_ACCESS_VIOLATION), "Expected STATUS_PARTIAL_COPY, got %08x\n", status); if (status == STATUS_PARTIAL_COPY) ok( readcount == 0, "Expected to read 0 bytes, got %ld\n",readcount); } diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 868470d61f0..23bc85dfa03 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -585,6 +585,7 @@ static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, LPCWSTR base, BOOL WCHAR buf[128]; HKEY hkey; BOOL ret = TRUE; + DWORD res; memcpy(buf, typelibW, sizeof(typelibW)); StringFromGUID2(uid, buf + lstrlenW(buf), 40); @@ -597,8 +598,16 @@ static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, LPCWSTR base, BOOL wsprintfW(buf + lstrlenW(buf), formatW, maj, min ); - if (RegCreateKeyExW(HKEY_CLASSES_ROOT, buf, 0, NULL, 0, - KEY_WRITE, NULL, &hkey, NULL) != ERROR_SUCCESS) + SetLastError(0xdeadbeef); + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, buf, 0, NULL, 0, + KEY_WRITE, NULL, &hkey, NULL); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("W-calls are not implemented\n"); + return FALSE; + } + + if (res != ERROR_SUCCESS) { trace("RegCreateKeyExW failed\n"); return FALSE; diff --git a/dlls/oleaut32/typelib.spec b/dlls/oleaut32/typelib.spec index 3f943e2795e..c9942886481 100644 --- a/dlls/oleaut32/typelib.spec +++ b/dlls/oleaut32/typelib.spec @@ -1,6 +1,6 @@ 2 stub CREATETYPELIB 3 pascal LoadTypeLib(ptr ptr) LoadTypeLib16 -4 stub LHASHVALOFNAMESYS +4 pascal LHashValOfNameSys(word long str) LHashValOfNameSysA 5 stub _IID_ICREATETYPEINFO 6 stub _IID_ICREATETYPELIB 7 stub _IID_ITYPECOMP diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index e39097baef9..0867d27d1c2 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -27,6 +27,7 @@ #include "dshow.h" #include "control.h" +static const CHAR fileA[] = "test.avi"; static const WCHAR file[] = {'t','e','s','t','.','a','v','i',0}; IGraphBuilder* pgraph; @@ -143,7 +144,7 @@ static void test_render_run(void) if (!createfiltergraph()) return; - h = CreateFileW(file, 0, 0, NULL, OPEN_EXISTING, 0, NULL); + h = CreateFileA(fileA, 0, 0, NULL, OPEN_EXISTING, 0, NULL); if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); renderfile(); diff --git a/dlls/rasapi32/tests/rasapi.c b/dlls/rasapi32/tests/rasapi.c index bcd43100537..a997e02d87f 100644 --- a/dlls/rasapi32/tests/rasapi.c +++ b/dlls/rasapi32/tests/rasapi.c @@ -59,6 +59,10 @@ static void test_rasenum(void) win_skip("RAS configuration problem\n"); return; } + if(ERROR_SUCCESS == result) { + win_skip("RasEnumDevicesA found nothing to enumerate\n"); + return; + } trace("RasEnumDevicesA: returned %d buffersize %d\n", result, cb); ok(result == ERROR_BUFFER_TOO_SMALL, "Expected ERROR_BUFFER_TOO_SMALL, got %08d\n", result); diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index aa5938326a3..adc9362907f 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -1410,6 +1410,28 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre style = ME_GetSelectionInsertStyle(editor); ME_InternalDeleteText(editor, from, to-from, FALSE); + + /* Don't insert text at the end of the table row */ + if (!editor->bEmulateVersion10) { /* v4.1 */ + ME_DisplayItem *para = ME_GetParagraph(editor->pCursors->pRun); + if (para->member.para.nFlags & MEPF_ROWEND) + { + para = para->member.para.next_para; + editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); + editor->pCursors[0].nOffset = 0; + } + if (para->member.para.nFlags & MEPF_ROWSTART) + { + para = para->member.para.next_para; + editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); + editor->pCursors[0].nOffset = 0; + } + editor->pCursors[1] = editor->pCursors[0]; + } else { /* v1.0 - 3.0 */ + if (editor->pCursors[0].pRun->member.run.nFlags & MERF_ENDPARA && + ME_IsInTable(editor->pCursors[0].pRun)) + return 0; + } } else { ME_DisplayItem *para_item; @@ -3663,6 +3685,8 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam, if (((unsigned)wstr)>=' ' || (wstr=='\r' && (GetWindowLongW(hWnd, GWL_STYLE) & ES_MULTILINE)) || wstr=='\t') { + ME_Cursor cursor = editor->pCursors[0]; + ME_DisplayItem *para = ME_GetParagraph(cursor.pRun); int from, to; BOOL ctrl_is_down = GetKeyState(VK_CONTROL) & 0x8000; ME_GetSelection(editor, &from, &to); @@ -3671,13 +3695,13 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam, && !(ctrl_is_down && !editor->bEmulateVersion10) ) { - ME_Cursor cursor = editor->pCursors[0]; ME_DisplayItem *para; BOOL bSelectedRow = FALSE; para = ME_GetParagraph(cursor.pRun); if (ME_IsSelection(editor) && cursor.pRun->member.run.nCharOfs + cursor.nOffset == 0 && + to == ME_GetCursorOfs(editor, 0) && para->member.para.prev_para->type == diParagraph) { para = para->member.para.prev_para; @@ -3689,6 +3713,74 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam, ME_CommitUndo(editor); return 0; } + } else if (!editor->bEmulateVersion10) { /* v4.1 */ + if (para->member.para.nFlags & MEPF_ROWEND) { + if (wstr=='\r') { + /* FIXME: Add a new table row after this row. */ + return 0; + } else if (from == to) { + para = para->member.para.next_para; + if (para->member.para.nFlags & MEPF_ROWSTART) + para = para->member.para.next_para; + editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); + editor->pCursors[0].nOffset = 0; + editor->pCursors[1] = editor->pCursors[0]; + } + } + else if (para == ME_GetParagraph(editor->pCursors[1].pRun) && + cursor.nOffset + cursor.pRun->member.run.nCharOfs == 0 && + para->member.para.prev_para->member.para.nFlags & MEPF_ROWSTART && + !para->member.para.prev_para->member.para.nCharOfs) + { + /* FIXME: Insert a newline before the table. */ + } + } else { /* v1.0 - 3.0 */ + ME_DisplayItem *para = ME_GetParagraph(cursor.pRun); + if (ME_IsInTable(cursor.pRun)) + { + if (cursor.pRun->member.run.nFlags & MERF_ENDPARA) + { + if (from == to) { + if (wstr=='\r') { + ME_ContinueCoalescingTransaction(editor); + para = ME_AppendTableRow(editor, para); + editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); + editor->pCursors[0].nOffset = 0; + editor->pCursors[1] = editor->pCursors[0]; + ME_CommitCoalescingUndo(editor); + ME_UpdateRepaint(editor); + } else { + /* Text should not be inserted at the end of the table. */ + MessageBeep(-1); + } + return 0; + } + } else if (wstr == '\r') { + ME_ContinueCoalescingTransaction(editor); + if (cursor.pRun->member.run.nCharOfs + cursor.nOffset == 0 && + !ME_IsInTable(para->member.para.prev_para)) + { + /* Insert newline before table */ + WCHAR endl = '\r'; + cursor.pRun = ME_FindItemBack(para, diRun); + if (cursor.pRun) + editor->pCursors[0].pRun = cursor.pRun; + editor->pCursors[0].nOffset = 0; + editor->pCursors[1] = editor->pCursors[0]; + ME_InsertTextFromCursor(editor, 0, &endl, 1, + editor->pCursors[0].pRun->member.run.style); + } else { + editor->pCursors[1] = editor->pCursors[0]; + para = ME_AppendTableRow(editor, para); + editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun); + editor->pCursors[0].nOffset = 0; + editor->pCursors[1] = editor->pCursors[0]; + } + ME_CommitCoalescingUndo(editor); + ME_UpdateRepaint(editor); + return 0; + } + } } /* FIXME maybe it would make sense to call EM_REPLACESEL instead ? */ /* WM_CHAR is restricted to nTextLimit */ diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 5e6f4cb502c..5e73c97cb45 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -296,6 +296,7 @@ ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para); ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para); void ME_CheckTablesForCorruption(ME_TextEditor *editor); void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars); +ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row); void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow); struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor); void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef); diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c index 248ea11719f..6289e345853 100644 --- a/dlls/riched20/table.c +++ b/dlls/riched20/table.c @@ -345,7 +345,7 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars) ME_DisplayItem *pRun; int nCharsToBoundary; - if (this_para->member.para.nCharOfs != nOfs && + if ((this_para->member.para.nCharOfs != nOfs || this_para == end_para) && this_para->member.para.pFmt->dwMask & PFM_TABLE && this_para->member.para.pFmt->wEffects & PFE_TABLE) { @@ -360,27 +360,13 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars) } else if (end_para->member.para.pFmt->dwMask & PFM_TABLE && end_para->member.para.pFmt->wEffects & PFE_TABLE) { - if (this_para == end_para) - { - pRun = c2.pRun; - /* Find the previous tab or end paragraph to use as a delete boundary */ - while (pRun && !(pRun->member.run.nFlags & (MERF_TAB|MERF_ENDPARA))) - pRun = ME_FindItemBack(pRun, diRun); - if (pRun && pRun->member.run.nFlags & MERF_ENDPARA) - { - /* We are in the first cell, and have gone back to the previous - * paragraph, so nothing needs to be protected. */ - pRun = NULL; - } - } else { - /* The deletion starts from before the row, so don't join it with - * previous non-empty paragraphs. */ - pRun = NULL; - if (nOfs > this_para->member.para.nCharOfs) - pRun = ME_FindItemBack(end_para, diRun); - if (!pRun) - pRun = ME_FindItemFwd(end_para, diRun); - } + /* The deletion starts from before the row, so don't join it with + * previous non-empty paragraphs. */ + pRun = NULL; + if (nOfs > this_para->member.para.nCharOfs) + pRun = ME_FindItemBack(end_para, diRun); + if (!pRun) + pRun = ME_FindItemFwd(end_para, diRun); if (pRun) { nCharsToBoundary = ME_GetParagraph(pRun)->member.para.nCharOfs @@ -395,8 +381,8 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, int nOfs,int *nChars) } } -static ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, - ME_DisplayItem *table_row) +ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, + ME_DisplayItem *table_row) { WCHAR endl = '\r', tab = '\t'; ME_DisplayItem *run; @@ -404,9 +390,13 @@ static ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, int i; assert(table_row); + assert(table_row->type == diParagraph); if (!editor->bEmulateVersion10) { /* v4.1 */ ME_DisplayItem *insertedCell, *para, *cell; - cell = ME_FindItemFwd(table_row, diCell); + if (table_row->member.para.nFlags & MEPF_ROWEND) + cell = ME_FindItemBack(table_row, diCell); + else + cell = ME_FindItemFwd(table_row, diCell); run = ME_GetTableRowEnd(table_row)->member.para.next_para; run = ME_FindItemFwd(run, diRun); editor->pCursors[0].pRun = run; @@ -416,12 +406,14 @@ static ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, insertedCell = ME_FindItemFwd(para, diCell); /* Copy cell properties */ insertedCell->member.cell.nRightBoundary = cell->member.cell.nRightBoundary; + insertedCell->member.cell.border = cell->member.cell.border; while (cell->member.cell.next_cell) { cell = cell->member.cell.next_cell; para = ME_InsertTableCellFromCursor(editor); insertedCell = ME_FindItemBack(para, diCell); /* Copy cell properties */ insertedCell->member.cell.nRightBoundary = cell->member.cell.nRightBoundary; + insertedCell->member.cell.border = cell->member.cell.border; }; ME_InsertTableRowEndFromCursor(editor); /* return the table row start for the inserted paragraph */ diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c index 7c538c60cdf..67dfae5d784 100644 --- a/dlls/rpcrt4/tests/ndr_marshall.c +++ b/dlls/rpcrt4/tests/ndr_marshall.c @@ -1185,6 +1185,9 @@ static void test_client_init(void) TEST_ZERO(fInDontFree, "%d"); TEST_ZERO(fDontCallFreeInst, "%d"); TEST_ZERO(fInOnlyParam, "%d"); + ok(stubMsg.fInOnlyParam == 0 || + stubMsg.fInOnlyParam == -1, /* Vista */ + "fInOnlyParam should have been set to 0 or -1 instead of %d\n", stubMsg.fInOnlyParam); TEST_ZERO(fHasReturn, "%d"); TEST_ZERO(fHasExtensions, "%d"); TEST_ZERO(fHasNewCorrDesc, "%d"); @@ -1195,7 +1198,9 @@ static void test_client_init(void) TEST_ZERO(fHasMemoryValidateCallback, "%d"); TEST_ZERO(fInFree, "%d"); TEST_ZERO(fNeedMCCP, "%d"); - TEST_ZERO(fUnused, "0x%x"); + ok(stubMsg.fUnused == 0 || + stubMsg.fUnused == -2, /* Vista */ + "fUnused should have been set to 0 or -2 instead of %d\n", stubMsg.fUnused); ok(stubMsg.fUnused2 == 0xffffcccc, "stubMsg.fUnused2 should have been 0xffffcccc instead of 0x%x\n", stubMsg.fUnused2); ok(stubMsg.dwDestContext == MSHCTX_DIFFERENTMACHINE, "stubMsg.dwDestContext should have been MSHCTX_DIFFERENTMACHINE instead of %d\n", stubMsg.dwDestContext); TEST_ZERO(pvDestContext, "%p"); @@ -1271,7 +1276,9 @@ todo_wine "stubMsg.pPointerQueueState should have been unset instead of %p\n", stubMsg.pPointerQueueState); TEST_ZERO(IgnoreEmbeddedPointers, "%d"); TEST_ZERO(PointerBufferMark, "%p"); - ok(stubMsg.CorrDespIncrement == 0xcc, "CorrDespIncrement should have been unset instead of 0x%x\n", stubMsg.CorrDespIncrement); + ok(stubMsg.CorrDespIncrement == 0xcc || + stubMsg.CorrDespIncrement == 0, + "CorrDespIncrement should have been unset instead of 0x%x\n", stubMsg.CorrDespIncrement); TEST_ZERO(uFlags, "%d"); /* FIXME: UniquePtrCount */ TEST_ULONG_PTR_UNSET(MaxCount); @@ -1289,7 +1296,9 @@ todo_wine TEST_ZERO(PointerLength, "%d"); TEST_ZERO(fInDontFree, "%d"); TEST_ZERO(fDontCallFreeInst, "%d"); - TEST_ZERO(fInOnlyParam, "%d"); + ok(stubMsg.fInOnlyParam == 0 || + stubMsg.fInOnlyParam == -1, /* Vista */ + "fInOnlyParam should have been set to 0 or -1 instead of %d\n", stubMsg.fInOnlyParam); TEST_ZERO(fHasReturn, "%d"); TEST_ZERO(fHasExtensions, "%d"); TEST_ZERO(fHasNewCorrDesc, "%d"); @@ -1300,7 +1309,9 @@ todo_wine TEST_ZERO(fHasMemoryValidateCallback, "%d"); TEST_ZERO(fInFree, "%d"); TEST_ZERO(fNeedMCCP, "%d"); - TEST_ZERO(fUnused, "0x%x"); + ok(stubMsg.fUnused == 0 || + stubMsg.fUnused == -2, /* Vista */ + "fUnused should have been set to 0 or -2 instead of %d\n", stubMsg.fUnused); ok(stubMsg.fUnused2 == 0xffffcccc, "stubMsg.fUnused2 should have been 0xffffcccc instead of 0x%x\n", stubMsg.fUnused2); ok(stubMsg.dwDestContext == MSHCTX_DIFFERENTMACHINE, "stubMsg.dwDestContext should have been MSHCTX_DIFFERENTMACHINE instead of %d\n", stubMsg.dwDestContext); TEST_ZERO(pvDestContext, "%p"); diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c index c59d7d6d3bd..bcd6a65107c 100644 --- a/dlls/rpcrt4/tests/rpc.c +++ b/dlls/rpcrt4/tests/rpc.c @@ -704,9 +704,17 @@ static void test_endpoint_mapper(RPC_CSTR protseq, RPC_CSTR address, RpcStringFree(&binding); + status = RpcBindingReset(handle); + ok(status == RPC_S_OK, "%s: RpcBindingReset failed with error %lu\n", protseq, status); + + RpcStringFree(&binding); + status = RpcEpResolveBinding(handle, IFoo_v0_0_s_ifspec); ok(status == RPC_S_OK, "%s: RpcEpResolveBinding failed with error %lu\n", protseq, status); + status = RpcBindingReset(handle); + ok(status == RPC_S_OK, "%s: RpcBindingReset failed with error %lu\n", protseq, status); + status = RpcBindingFree(&handle); ok(status == RPC_S_OK, "%s: RpcBindingFree failed with error %lu\n", protseq, status); diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c index 0bf84d58225..78a8bffb7f2 100644 --- a/dlls/rpcrt4/tests/server.c +++ b/dlls/rpcrt4/tests/server.c @@ -1295,7 +1295,10 @@ server(void) iptcp_status = RpcServerUseProtseqEp(iptcp, 20, port, NULL); ok(iptcp_status == RPC_S_OK, "RpcServerUseProtseqEp(ncacn_ip_tcp) failed with status %ld\n", iptcp_status); np_status = RpcServerUseProtseqEp(np, 0, pipe, NULL); - ok(np_status == RPC_S_OK, "RpcServerUseProtseqEp(ncacn_np) failed with status %ld\n", np_status); + if (np_status == RPC_S_PROTSEQ_NOT_SUPPORTED) + skip("Protocol sequence ncacn_np is not supported\n"); + else + ok(np_status == RPC_S_OK, "RpcServerUseProtseqEp(ncacn_np) failed with status %ld\n", np_status); pRpcServerRegisterIfEx = (void *)GetProcAddress(GetModuleHandle("rpcrt4.dll"), "RpcServerRegisterIfEx"); if (pRpcServerRegisterIfEx) diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c index 908503c1870..112c12a3735 100644 --- a/dlls/shdocvw/dochost.c +++ b/dlls/shdocvw/dochost.c @@ -48,15 +48,9 @@ LRESULT process_dochost_task(DocHost *This, LPARAM lparam) static void navigate_complete(DocHost *This) { - IDispatch *disp = NULL; DISPPARAMS dispparams; VARIANTARG params[2]; VARIANT url; - HRESULT hres; - - hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp); - if(FAILED(hres)) - FIXME("Could not get IDispatch interface\n"); dispparams.cArgs = 2; dispparams.cNamedArgs = 0; @@ -67,7 +61,7 @@ static void navigate_complete(DocHost *This) V_BYREF(params) = &url; V_VT(params+1) = VT_DISPATCH; - V_DISPATCH(params+1) = disp; + V_DISPATCH(params+1) = This->disp; V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocString(This->url); @@ -76,8 +70,6 @@ static void navigate_complete(DocHost *This) call_sink(This->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dispparams); SysFreeString(V_BSTR(&url)); - if(disp) - IDispatch_Release(disp); This->busy = VARIANT_FALSE; } diff --git a/dlls/shell32/shell32_Cn.rc b/dlls/shell32/shell32_Cn.rc deleted file mode 100644 index 2e2bbf32073..00000000000 --- a/dlls/shell32/shell32_Cn.rc +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2002 Tisheng Chen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#pragma code_page(936) - -/* - shellview item menu -*/ -MENU_SHV_FILE MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "Ñ¡Ôñ(&S)" FCIDM_SHVIEW_OPEN - MENUITEM "Îļþ¹ÜÀíÆ÷(&x)",FCIDM_SHVIEW_EXPLORE - MENUITEM "´ò¿ª(&O)", FCIDM_SHVIEW_OPEN - MENUITEM SEPARATOR - MENUITEM "¼ôÇÐ(&u)", FCIDM_SHVIEW_CUT - MENUITEM "¸´ÖÆ(&C)", FCIDM_SHVIEW_COPY - MENUITEM SEPARATOR - MENUITEM "Éú³ÉÁ¬½Ó(&L)", FCIDM_SHVIEW_CREATELINK - MENUITEM "ɾ³ý(&D)", FCIDM_SHVIEW_DELETE - MENUITEM "¸ÄÃû(&R)", FCIDM_SHVIEW_RENAME - MENUITEM SEPARATOR - MENUITEM "ÊôÐÔ(&P)", FCIDM_SHVIEW_PROPERTIES - END -END - -MENU_CPANEL MENU -BEGIN - POPUP "Îļþ(&F)" - BEGIN - MENUITEM SEPARATOR - MENUITEM "Í˳ö(&x)", IDM_CPANEL_EXIT - END - - POPUP "²é¿´(&V)" - BEGIN - MENUITEM "´óͼ±ê(&g)", FCIDM_SHVIEW_BIGICON - MENUITEM "Сͼ±ê(&m)", FCIDM_SHVIEW_SMALLICON - MENUITEM "Áбí(&L)", FCIDM_SHVIEW_LISTVIEW - MENUITEM "ÏêÇé(&D)", FCIDM_SHVIEW_REPORTVIEW - END - - POPUP "°ïÖú(&H)" - BEGIN - MENUITEM "¹ØÓÚ¿ØÖÆÃæ°å(&A)...", IDM_CPANEL_ABOUT - END -END - -SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "¹ØÓÚ %s" -FONT 10, "MS Shell Dlg" -{ - DEFPUSHBUTTON "È·¶¨", IDOK, 153, 133, 60, 12, WS_TABSTOP - PUSHBUTTON "ʹÓÃÐí¿É(&l)...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP - LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER - ICON "", stc1, 10, 10, 30, 30 - LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 170, 10 - LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 170, 10 - LTEXT "ÔËÐÐÓÚ %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10 - LTEXT "Wine ¿ª·¢ÈËÔ±:", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10 -} - -SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "" -FONT 8, "MS Shell Dlg" -{ - ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "ÊäÈë³ÌÐò£¬Ä¿Â¼£¬Îļþ»òÕßInternet×ÊÔ´Ãû£¬Wine½«ÎªÄú´ò¿ªËü¡£", 12289, 36, 11, 182, 18 - LTEXT "´ò¿ª(&O):", 12305, 7, 39, 24, 10 - CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 - DEFPUSHBUTTON "È·¶¨", IDOK, 62, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "È¡Ïû", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "ä¯ÀÀ(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP -} - -/* columns in the shellview */ -STRINGTABLE -BEGIN - IDS_SHV_COLUMN1 "Îļþ" - IDS_SHV_COLUMN2 "´óС" - IDS_SHV_COLUMN3 "ÀàÐÍ" - IDS_SHV_COLUMN4 "ÐÞ¸Ä" - IDS_SHV_COLUMN5 "ÊôÐÔ" - IDS_SHV_COLUMN6 "ʹÓÿռä" - IDS_SHV_COLUMN7 "Ê£Óà¿Õ¼ä" - IDS_SHV_COLUMN8 "Ãû³Æ" - IDS_SHV_COLUMN9 "±¸×¢" - - IDS_CPANEL_TITLE "Wine ¿ØÖÆÃæ°å" - IDS_CPANEL_NAME "Ãû³Æ" - IDS_CPANEL_DESCRIPTION "ÃèÊö" -END - -#pragma code_page(default) diff --git a/dlls/shell32/shell32_Zh.rc b/dlls/shell32/shell32_Zh.rc index cb3839a4fcc..282e88b3b09 100644 --- a/dlls/shell32/shell32_Zh.rc +++ b/dlls/shell32/shell32_Zh.rc @@ -1,5 +1,9 @@ /* + * shell32 (Traditional Chinese Resource) + * * Copyright 1998 Juergen Schmied + * Copyright 2002 Tisheng Chen + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,8 +20,104 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "选择(&S)" FCIDM_SHVIEW_OPEN + MENUITEM "文件管理器(&x)",FCIDM_SHVIEW_EXPLORE + MENUITEM "打开(&O)", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "剪切(&u)", FCIDM_SHVIEW_CUT + MENUITEM "复制(&C)", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "生成连接(&L)", FCIDM_SHVIEW_CREATELINK + MENUITEM "删除(&D)", FCIDM_SHVIEW_DELETE + MENUITEM "改名(&R)", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "属性(&P)", FCIDM_SHVIEW_PROPERTIES + END +END + +MENU_CPANEL MENU +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM SEPARATOR + MENUITEM "退出(&x)", IDM_CPANEL_EXIT + END + + POPUP "查看(&V)" + BEGIN + MENUITEM "大图标(&g)", FCIDM_SHVIEW_BIGICON + MENUITEM "小图标(&m)", FCIDM_SHVIEW_SMALLICON + MENUITEM "列表(&L)", FCIDM_SHVIEW_LISTVIEW + MENUITEM "详情(&D)", FCIDM_SHVIEW_REPORTVIEW + END + + POPUP "帮助(&H)" + BEGIN + MENUITEM "关于控制面板(&A)...", IDM_CPANEL_ABOUT + END +END + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "关于 %s" +FONT 9, "MS Song" +{ + DEFPUSHBUTTON "确定", IDOK, 153, 133, 60, 12, WS_TABSTOP + PUSHBUTTON "使用许可(&l)...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP + LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", stc1, 10, 10, 30, 30 + LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 170, 10 + LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 170, 10 + LTEXT "运行于 %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10 + LTEXT "Wine 开发人员:", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 9, "MS Song" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "输入程序,目录,文件或者Internet资源名,Wine将为您打开它。", 12289, 36, 11, 182, 18 + LTEXT "打开(&O):", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "确定", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "浏览(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "文件" + IDS_SHV_COLUMN2 "大小" + IDS_SHV_COLUMN3 "类型" + IDS_SHV_COLUMN4 "修改" + IDS_SHV_COLUMN5 "属性" + IDS_SHV_COLUMN6 "使用空间" + IDS_SHV_COLUMN7 "剩余空间" + IDS_SHV_COLUMN8 "名称" + IDS_SHV_COLUMN9 "备注" + + IDS_CPANEL_TITLE "Wine 控制面板" + IDS_CPANEL_NAME "名称" + IDS_CPANEL_DESCRIPTION "描述" +END + + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#pragma code_page(936) /* FIXME: default for CHINESE_TRADITIONAL is 950 */ /* shellview item menu @@ -26,88 +126,88 @@ MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Select" FCIDM_SHVIEW_OPEN - MENUITEM "E&xplore", FCIDM_SHVIEW_EXPLORE - MENUITEM "&Open", FCIDM_SHVIEW_OPEN + MENUITEM "選擇(&S)" FCIDM_SHVIEW_OPEN + MENUITEM "檔案管理器(&x)", FCIDM_SHVIEW_EXPLORE + MENUITEM "開啟(&O)", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR - MENUITEM "C&ut", FCIDM_SHVIEW_CUT - MENUITEM "&Copy", FCIDM_SHVIEW_COPY + MENUITEM "剪下(&u)", FCIDM_SHVIEW_CUT + MENUITEM "複製(&C)", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK - MENUITEM "&Delete", FCIDM_SHVIEW_DELETE - MENUITEM "&Rename", FCIDM_SHVIEW_RENAME + MENUITEM "生成連接(&L)", FCIDM_SHVIEW_CREATELINK + MENUITEM "刪除(&D)", FCIDM_SHVIEW_DELETE + MENUITEM "改名(&R)", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR - MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES + MENUITEM "屬性(&P)", FCIDM_SHVIEW_PROPERTIES END END MENU_CPANEL MENU BEGIN - POPUP "&File" + POPUP "檔案(&F)" BEGIN MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_CPANEL_EXIT + MENUITEM "結束(&x)", IDM_CPANEL_EXIT END - POPUP "&View" + POPUP "檢視(&V)" BEGIN - MENUITEM "Lar&ge Icons", FCIDM_SHVIEW_BIGICON - MENUITEM "S&mall Icons", FCIDM_SHVIEW_SMALLICON - MENUITEM "&List", FCIDM_SHVIEW_LISTVIEW - MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW + MENUITEM "大圖標(&g)", FCIDM_SHVIEW_BIGICON + MENUITEM "小圖標(&m)", FCIDM_SHVIEW_SMALLICON + MENUITEM "列表(&L)", FCIDM_SHVIEW_LISTVIEW + MENUITEM "詳情(&D)", FCIDM_SHVIEW_REPORTVIEW END - POPUP "&Help" + POPUP "幫助(&H)" BEGIN - MENUITEM "&About Control Panel...", IDM_CPANEL_ABOUT + MENUITEM "關於控制面板(&A)...", IDM_CPANEL_ABOUT END END SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "êPì¶ %s" -FONT 8, "MS Shell Dlg" +CAPTION "關於 %s" +FONT 8, "PMingLiu" { - DEFPUSHBUTTON "´_¶¨", IDOK, 153, 133, 60, 12, WS_TABSTOP - PUSHBUTTON "Wine &license...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP + DEFPUSHBUTTON "確定", IDOK, 153, 133, 60, 12, WS_TABSTOP + PUSHBUTTON "使用許可(&l)...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER ICON "", stc1, 10, 10, 30, 30 LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 170, 10 LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 170, 10 - LTEXT "Running on %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10 - LTEXT "Wine was brought to you by:", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10 + LTEXT "運行於 %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10 + LTEXT "Wine 開發人員 :", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" -FONT 8, "MS Shell Dlg" +FONT 8, "PMingLiu" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 - LTEXT "&Open:", 12305, 7, 39, 24, 10 + LTEXT "輸入程式,目錄,檔案或者Internet資源名,Wine將為您開啟它。", 12289, 36, 11, 182, 18 + LTEXT "打開(&O):", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 - DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP + DEFPUSHBUTTON "確定", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "瀏覽(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP } /* columns in the shellview */ STRINGTABLE BEGIN - IDS_SHV_COLUMN1 "™n°¸" - IDS_SHV_COLUMN2 "´óС" - IDS_SHV_COLUMN3 "î�ÐÍ" - IDS_SHV_COLUMN4 "ÒÑÐÞ¸Ä" - IDS_SHV_COLUMN5 "ŒÙÐÔ" - IDS_SHV_COLUMN6 "ʹÓÿÕég" - IDS_SHV_COLUMN7 "Ê£ðN¿Õég" - IDS_SHV_COLUMN8 "Name" /*FIXME*/ - IDS_SHV_COLUMN9 "Comments" /*FIXME*/ - - IDS_CPANEL_TITLE "Wine Control Panel" - IDS_CPANEL_NAME "Name" - IDS_CPANEL_DESCRIPTION "Description" + IDS_SHV_COLUMN1 "檔案" + IDS_SHV_COLUMN2 "大小" + IDS_SHV_COLUMN3 "類型" + IDS_SHV_COLUMN4 "已修改" + IDS_SHV_COLUMN5 "屬性" + IDS_SHV_COLUMN6 "使用空間" + IDS_SHV_COLUMN7 "剩餘空間" + IDS_SHV_COLUMN8 "名稱" + IDS_SHV_COLUMN9 "備註" + + IDS_CPANEL_TITLE "Wine 控制面板" + IDS_CPANEL_NAME "名稱" + IDS_CPANEL_DESCRIPTION "描述" END #pragma code_page(default) diff --git a/dlls/shell32/shres.rc b/dlls/shell32/shres.rc index b82c839a1b1..8222f95e47c 100644 --- a/dlls/shell32/shres.rc +++ b/dlls/shell32/shres.rc @@ -130,7 +130,6 @@ IDR_AVI_FILEDELETE AVI searching.avi */ #include "shell32_Bg.rc" #include "shell32_Ca.rc" -#include "shell32_Cn.rc" #include "shell32_Cs.rc" #include "shell32_Da.rc" #include "shell32_De.rc" diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c index 07257d70e1d..d84ca7a8bd7 100644 --- a/dlls/shlwapi/tests/path.c +++ b/dlls/shlwapi/tests/path.c @@ -913,7 +913,8 @@ static void test_PathCanonicalizeA(void) ok(!res, "Expected failure\n"); todo_wine { - ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); + ok(GetLastError() == 0xdeadbeef || GetLastError() == ERROR_FILENAME_EXCED_RANGE /* Vista */, + "Expected 0xdeadbeef or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError()); } ok(lstrlen(too_long) == LONG_LEN - 1, "Expected length LONG_LEN - 1, got %i\n", lstrlen(too_long)); } diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index ede4d7c7c19..c7c6f8f74a3 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1,7 +1,7 @@ /* Unit test suite for Path functions * * Copyright 2002 Matthew Mastracci - * Copyright 2007 Detlef Riekenberg + * Copyright 2007,2008 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -40,6 +40,35 @@ static const CHAR winehqA[] = {'h','t','t','p',':','/','/','w','w','w','.','w', /* ################ */ +static const CHAR untouchedA[] = "untouched"; + +#define TEST_APPLY_MAX_LENGTH INTERNET_MAX_URL_LENGTH + +typedef struct _TEST_URL_APPLY { + const char * url; + DWORD flags; + HRESULT res; + DWORD newlen; + const char * newurl; +} TEST_URL_APPLY; + +static const TEST_URL_APPLY TEST_APPLY[] = { + {"www.winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 21, "http://www.winehq.org"}, + {"www.winehq.org", URL_APPLY_GUESSSCHEME, S_OK, 21, "http://www.winehq.org"}, + {"www.winehq.org", URL_APPLY_DEFAULT, S_OK, 21, "http://www.winehq.org"}, + {"ftp.winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 20, "ftp://ftp.winehq.org"}, + {"ftp.winehq.org", URL_APPLY_GUESSSCHEME, S_OK, 20, "ftp://ftp.winehq.org"}, + {"ftp.winehq.org", URL_APPLY_DEFAULT, S_OK, 21, "http://ftp.winehq.org"}, + {"winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 17, "http://winehq.org"}, + {"winehq.org", URL_APPLY_GUESSSCHEME, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, + {"winehq.org", URL_APPLY_DEFAULT, S_OK, 17, "http://winehq.org"}, + {"", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 7, "http://"}, + {"", URL_APPLY_GUESSSCHEME, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, + {"", URL_APPLY_DEFAULT, S_OK, 7, "http://"} +}; + +/* ################ */ + typedef struct _TEST_URL_CANONICALIZE { const char *url; DWORD flags; @@ -267,7 +296,8 @@ static struct { const char *expect; } TEST_URL_UNESCAPE[] = { {"file://foo/bar", "file://foo/bar"}, - {"file://fo%20o%5Ca/bar", "file://fo o\\a/bar"} + {"file://fo%20o%5Ca/bar", "file://fo o\\a/bar"}, + {"file://%24%25foobar", "file://$%foobar"} }; /* ################ */ @@ -338,6 +368,79 @@ static void FreeWideString(LPWSTR wszString) /* ########################### */ +static void test_UrlApplyScheme(void) +{ + CHAR newurl[TEST_APPLY_MAX_LENGTH]; + WCHAR urlW[TEST_APPLY_MAX_LENGTH]; + WCHAR newurlW[TEST_APPLY_MAX_LENGTH]; + HRESULT res; + DWORD len; + DWORD i; + + for(i = 0; i < sizeof(TEST_APPLY)/sizeof(TEST_APPLY[0]); i++) { + len = TEST_APPLY_MAX_LENGTH; + lstrcpyA(newurl, untouchedA); + res = UrlApplySchemeA(TEST_APPLY[i].url, newurl, &len, TEST_APPLY[i].flags); + ok( res == TEST_APPLY[i].res, + "#%dA: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res); + + ok( len == TEST_APPLY[i].newlen, + "#%dA: got len %d (expected %d)\n", i, len, TEST_APPLY[i].newlen); + + ok( !lstrcmpA(newurl, TEST_APPLY[i].newurl), + "#%dA: got '%s' (expected '%s')\n", i, newurl, TEST_APPLY[i].newurl); + + /* returned length is in character */ + len = TEST_APPLY_MAX_LENGTH; + lstrcpyA(newurl, untouchedA); + MultiByteToWideChar(CP_ACP, 0, newurl, -1, newurlW, len); + MultiByteToWideChar(CP_ACP, 0, TEST_APPLY[i].url, -1, urlW, len); + + res = UrlApplySchemeW(urlW, newurlW, &len, TEST_APPLY[i].flags); + WideCharToMultiByte(CP_ACP, 0, newurlW, -1, newurl, TEST_APPLY_MAX_LENGTH, NULL, NULL); + ok( res == TEST_APPLY[i].res, + "#%dW: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res); + + ok( len == TEST_APPLY[i].newlen, + "#%dW: got len %d (expected %d)\n", i, len, TEST_APPLY[i].newlen); + + ok( !lstrcmpA(newurl, TEST_APPLY[i].newurl), + "#%dW: got '%s' (expected '%s')\n", i, newurl, TEST_APPLY[i].newurl); + + } + + /* buffer too small */ + lstrcpyA(newurl, untouchedA); + len = lstrlenA(TEST_APPLY[0].newurl); + res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, &len, TEST_APPLY[0].flags); + ok(res == E_POINTER, "got HRESULT 0x%x (expected E_POINTER)\n", res); + /* The returned length include the space for the terminating 0 */ + i = lstrlenA(TEST_APPLY[0].newurl)+1; + ok(len == i, "got len %d (expected %d)\n", len, i); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + + /* NULL as parameter. The length and the buffer are not modified */ + lstrcpyA(newurl, untouchedA); + len = TEST_APPLY_MAX_LENGTH; + res = UrlApplySchemeA(NULL, newurl, &len, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d (expected %d)\n", len, TEST_APPLY_MAX_LENGTH); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + + len = TEST_APPLY_MAX_LENGTH; + res = UrlApplySchemeA(TEST_APPLY[0].url, NULL, &len, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d (expected %d)\n", len, TEST_APPLY_MAX_LENGTH); + + lstrcpyA(newurl, untouchedA); + res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, NULL, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + +} + +/* ########################### */ + static void hash_url(const char* szUrl) { LPCSTR szTestUrl = szUrl; @@ -804,14 +907,21 @@ static void test_UrlUnescape(void) DWORD dwEscaped; size_t i; static char inplace[] = "file:///C:/Program%20Files"; + static char another_inplace[] = "file:///C:/Program%20Files"; static const char expected[] = "file:///C:/Program Files"; static WCHAR inplaceW[] = {'f','i','l','e',':','/','/','/','C',':','/','P','r','o','g','r','a','m',' ','F','i','l','e','s',0}; + static WCHAR another_inplaceW[] = {'f','i','l','e',':','/','/','/','C',':','/','P','r','o','g','r','a','m','%','2','0','F','i','l','e','s',0}; for(i=0; i *pcchOut) { - *pcchOut = len2; - HeapFree(GetProcessHeap(), 0, in); - return E_POINTER; + len = WideCharToMultiByte(CP_ACP, 0, out, -1, NULL, 0, NULL, NULL); + if (len > *pcchOut) { + ret = E_POINTER; + goto cleanup; } - WideCharToMultiByte(0, 0, out, len+1, pszOut, *pcchOut, 0, 0); - *pcchOut = len2; + + WideCharToMultiByte(CP_ACP, 0, out, -1, pszOut, *pcchOut, NULL, NULL); + len--; + +cleanup: + *pcchOut = len; HeapFree(GetProcessHeap(), 0, in); return ret; } @@ -1586,7 +1596,7 @@ static HRESULT URL_ApplyDefault(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) { HKEY newkey; DWORD data_len, dwType; - WCHAR value[MAX_PATH], data[MAX_PATH]; + WCHAR data[MAX_PATH]; static const WCHAR prefix_keyW[] = {'S','o','f','t','w','a','r','e', @@ -1598,14 +1608,12 @@ static HRESULT URL_ApplyDefault(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) /* get and prepend default */ RegOpenKeyExW(HKEY_LOCAL_MACHINE, prefix_keyW, 0, 1, &newkey); - data_len = MAX_PATH; - value[0] = '@'; - value[1] = '\0'; - RegQueryValueExW(newkey, value, 0, &dwType, (LPBYTE)data, &data_len); + data_len = sizeof(data); + RegQueryValueExW(newkey, NULL, 0, &dwType, (LPBYTE)data, &data_len); RegCloseKey(newkey); if (strlenW(data) + strlenW(pszIn) + 1 > *pcchOut) { - *pcchOut = strlenW(data) + strlenW(pszIn) + 1; - return E_POINTER; + *pcchOut = strlenW(data) + strlenW(pszIn) + 1; + return E_POINTER; } strcpyW(pszOut, data); strcatW(pszOut, pszIn); @@ -1625,8 +1633,10 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW DWORD res1; HRESULT ret; - TRACE("(in %s, out size %d, flags %08x)\n", - debugstr_w(pszIn), *pcchOut, dwFlags); + TRACE("(%s, %p, %p:out size %d, 0x%08x)\n", debugstr_w(pszIn), + pszOut, pcchOut, pcchOut ? *pcchOut : 0, dwFlags); + + if (!pszIn || !pszOut || !pcchOut) return E_INVALIDARG; if (dwFlags & URL_APPLY_GUESSFILE) { FIXME("(%s %p %p(%d) 0x%08x): stub URL_APPLY_GUESSFILE not implemented\n", @@ -1671,14 +1681,6 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW return URL_ApplyDefault(pszIn, pszOut, pcchOut); } - /* just copy and give proper return code */ - if (strlenW(pszIn) + 1 > *pcchOut) { - *pcchOut = strlenW(pszIn) + 1; - return E_POINTER; - } - strcpyW(pszOut, pszIn); - *pcchOut = strlenW(pszOut); - TRACE("returning copy, left alone\n"); return S_FALSE; } diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 9f14cb89e4e..2279087e552 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -1006,28 +1006,25 @@ static CURSORICONFILEDIRENTRY *CURSORICON_FindBestIconFile( CURSORICONFILEDIR *d return &dir->idEntries[n]; } -static BOOL load_cursor_frame( LPBYTE bits, UINT cbSize, POINT16 hotspot, DWORD dwVersion, - INT width, INT height, UINT cFlag, cursor_frame_t *frame ) +static BOOL load_cursor_frame( BITMAPINFO *bmi, + POINT16 hotspot, BOOL bIcon, + DWORD dwVersion, + INT width, INT height, + UINT cFlag, cursor_frame_t *frame ) { static HDC hdcMem; int sizeAnd, sizeXor; HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */ BITMAP bmpXor, bmpAnd; - BITMAPINFO *bmi; BOOL DoStretch; INT size; - TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s\n", - bits, cbSize, dwVersion, width, height, - (cFlag & LR_MONOCHROME) ? "mono" : "" ); if (dwVersion == 0x00020000) { FIXME_(cursor)("\t2.xx resources are not supported\n"); return FALSE; } - bmi = (BITMAPINFO *)bits; - /* Check bitmap header */ if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) && @@ -1192,6 +1189,7 @@ static BOOL load_cursor_frame( LPBYTE bits, UINT cbSize, POINT16 hotspot, DWORD return TRUE; } + /********************************************************************** * .ANI cursor support */ @@ -1445,22 +1443,27 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize, UINT cFlag ) { POINT16 hotspot; + BITMAPINFO *bmi; HCURSOR cursor = create_cursor( 1, 0 ); cursor_frame_t frame = {0}; + hotspot.x = ICON_HOTSPOT; + hotspot.y = ICON_HOTSPOT; + + TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s %s\n", + bits, cbSize, dwVersion, width, height, + bIcon ? "icon" : "cursor", (cFlag & LR_MONOCHROME) ? "mono" : "" ); + if (bIcon) + bmi = (BITMAPINFO *)bits; + else /* get the hotspot */ { - hotspot.x = ICON_HOTSPOT; - hotspot.y = ICON_HOTSPOT; - } - else - { - hotspot = *(POINT16 *)bits; - bits = (LPBYTE)(((POINT16 *)bits) + 1); + POINT16 *pt = (POINT16 *)bits; + hotspot = *pt; + bmi = (BITMAPINFO *)(pt + 1); } - if (load_cursor_frame( bits, cbSize, hotspot, dwVersion, width, height, cFlag, &frame )) - { + if (load_cursor_frame( bmi, hotspot, dwVersion, width, height, cFlag, &frame )) set_cursor_frame( cursor, 0, &frame ); } else @@ -1494,8 +1497,8 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename, CURSORICONFILEDIR *dir; DWORD filesize = 0; HICON hIcon = 0; - POINT16 hotspot; LPBYTE bits; + POINT16 hotspot; TRACE("loading %s\n", debugstr_w( filename )); @@ -1546,11 +1549,18 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename, hotspot.x = ICON_HOTSPOT; hotspot.y = ICON_HOTSPOT; } - hIcon = create_cursor( 1, 0 ); - load_cursor_frame( &bits[entry->dwDIBOffset], entry->dwDIBSize, hotspot, - 0x00030000, width, height, loadflags, &frame ); - set_cursor_frame( hIcon, 0, &frame ); + if (load_cursor_frame( (BITMAPINFO *)&bits[entry->dwDIBOffset], + hotspot, 0x00030000, + width, height, loadflags, + &frame )) + set_cursor_frame( hIcon, 0, &frame ); + } + else + { + destroy_cursor( hIcon ); + hIcon = 0; + } HeapFree( GetProcessHeap(), 0, frame.bits ); end: diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c index 0594b558655..fe70b805c83 100644 --- a/dlls/user32/mdi.c +++ b/dlls/user32/mdi.c @@ -1257,7 +1257,7 @@ static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, return 0; case WM_SIZE: - if( ci->hwndChildMaximized ) + if( ci->hwndActiveChild && IsZoomed(ci->hwndActiveChild) ) { RECT rect; @@ -1265,10 +1265,9 @@ static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, rect.top = 0; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); - - AdjustWindowRectEx( &rect, GetWindowLongA(ci->hwndChildMaximized, GWL_STYLE), - 0, GetWindowLongA(ci->hwndChildMaximized, GWL_EXSTYLE) ); - MoveWindow( ci->hwndChildMaximized, rect.left, rect.top, + AdjustWindowRectEx(&rect, GetWindowLongA(ci->hwndActiveChild, GWL_STYLE), + 0, GetWindowLongA(ci->hwndActiveChild, GWL_EXSTYLE) ); + MoveWindow(ci->hwndActiveChild, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 1); } else diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 522ff386db4..59901331518 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -52,7 +52,6 @@ WINE_DECLARE_DEBUG_CHANNEL(key); #define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST)) #define MAX_PACK_COUNT 4 -#define MAX_SENDMSG_RECURSION 64 #define SYS_TIMER_RATE 55 /* min. timer rate in ms (actually 54.925)*/ @@ -1613,14 +1612,10 @@ static BOOL unpack_dde_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL unicode, BOOL same_thread, enum wm_char_mapping mapping ) { - struct user_thread_info *thread_info = get_user_thread_info(); LRESULT result = 0; CWPSTRUCT cwp; CWPRETSTRUCT cwpret; - if (thread_info->recursion_count > MAX_SENDMSG_RECURSION) return 0; - thread_info->recursion_count++; - if (msg & 0x80000000) { result = handle_internal_message( hwnd, msg, wparam, lparam ); @@ -1646,7 +1641,6 @@ static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar cwpret.hwnd = hwnd; HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, same_thread, (LPARAM)&cwpret, unicode ); done: - thread_info->recursion_count--; return result; } diff --git a/dlls/user32/misc.c b/dlls/user32/misc.c index 65176e307d6..f91be622dc0 100644 --- a/dlls/user32/misc.c +++ b/dlls/user32/misc.c @@ -564,8 +564,9 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE hnd, LPVOID notifyfilter, D */ HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE hRecepient, LPVOID pNotificationFilter, DWORD dwFlags) { - FIXME("(hwnd=%p, filter=%p,flags=0x%08x), STUB!\n", hRecepient,pNotificationFilter,dwFlags ); - return 0; + FIXME("(hwnd=%p, filter=%p,flags=0x%08x),\n" + "\treturns a fake device notification handle!\n", hRecepient,pNotificationFilter,dwFlags ); + return (HDEVNOTIFY) 0xcafeaffe; } /*********************************************************************** diff --git a/dlls/user32/resources/user32_Zh.rc b/dlls/user32/resources/user32_Zh.rc index 663df125fb2..02ee773196f 100644 --- a/dlls/user32/resources/user32_Zh.rc +++ b/dlls/user32/resources/user32_Zh.rc @@ -1,5 +1,8 @@ /* + * user32 (Simplified and Traditional Chinese Resource) + * * Copyright 2000 Aric Stewart + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,35 +19,38 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE { - MENUITEM "»Ö¸´(&R)", 61728 - MENUITEM "Òƶ¯(&M)", 61456 - MENUITEM "´óС(&S)", 61440 - MENUITEM "×îС»¯(&N)", 61472 - MENUITEM "×î´ó»¯(&X)", 61488 + MENUITEM "恢复(&R)", 61728 + MENUITEM "移动(&M)", 61456 + MENUITEM "大小(&S)", 61440 + MENUITEM "最小化(&N)", 61472 + MENUITEM "最大化(&X)", 61488 MENUITEM SEPARATOR - MENUITEM "¹Ø±Õ(&N)\tAlt-F4", 61536 + MENUITEM "关闭(&N)\tAlt-F4", 61536 MENUITEM SEPARATOR - MENUITEM "Çл»µ½(&S)...\tCtrl-Esc", 61744 + MENUITEM "切换到(&S)...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "¹ØÓÚWine (&A)...", 61761 + MENUITEM "关于Wine (&A)...", 61761 } EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE { POPUP "" BEGIN - MENUITEM "³·Ïû(&U)", EM_UNDO + MENUITEM "撤消(&U)", EM_UNDO MENUITEM SEPARATOR - MENUITEM "¼ôÇÐ(&T)", WM_CUT - MENUITEM "¸´ÖÆ(&C)", WM_COPY - MENUITEM "Õ³Ìù(&P)", WM_PASTE - MENUITEM "ɾ³ý(&D)", WM_CLEAR + MENUITEM "剪切(&T)", WM_CUT + MENUITEM "复制(&C)", WM_COPY + MENUITEM "粘贴(&P)", WM_PASTE + MENUITEM "删除(&D)", WM_CLEAR MENUITEM SEPARATOR - MENUITEM "ȫѡ(&A)", EM_SETSEL + MENUITEM "全选(&A)", EM_SETSEL END } @@ -53,64 +59,63 @@ STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS BEGIN ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP | SS_NOPREFIX - PUSHBUTTON "È·¶¨(&O)", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "È¡Ïû(&C)", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÖÐÖ¹(&A)", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÖØÊÔ(&R)", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ºöÂÔ(&I)", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÊÇ(&Y)", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "·ñ(&N)", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÔÙÊÔ(&T)", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "¼ÌÐø(&C)", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "°ïÖú", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "确定(&O)", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "取消(&C)", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "中止(&A)", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "重试(&R)", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "忽略(&I)", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "是(&Y)", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "否(&N)", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "再试(&T)", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "继续(&C)", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "帮助", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END MDI_MOREWINDOWS DIALOG FIXED IMPURE 20, 20, 232, 122 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ñ¡Ôñ´°¿Ú" -FONT 8, "MS Shell Dlg" +CAPTION "选择窗口" +FONT 8, "PMingLiu" BEGIN LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in mdi.h */ - DEFPUSHBUTTON "È·¶¨", IDOK, 75, 100, 35, 14 - PUSHBUTTON "È¡Ïû", IDCANCEL, 120, 100, 35, 14 + DEFPUSHBUTTON "确定", IDOK, 75, 100, 35, 14 + PUSHBUTTON "取消", IDCANCEL, 120, 100, 35, 14 END STRINGTABLE DISCARDABLE { - IDS_ERROR "´íÎó" - IDS_MDI_MOREWINDOWS "¸ü¶à´°¿Ú(&M)..." /* defined in mdi.h */ + IDS_ERROR "错误" + IDS_MDI_MOREWINDOWS "更多窗口(&M)..." /* defined in mdi.h */ } LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -#pragma code_page(936) /* FIXME: default for CHINESE_TRADITIONAL is 950 */ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE { - MENUITEM "»Ø�Í(&R)", 61728 - MENUITEM "ÒÆ„Ó(&M)", 61456 - MENUITEM "´óС(&S)", 61440 - MENUITEM "×îС»¯(&N)", 61472 - MENUITEM "×î´ó»¯(&X)", 61488 + MENUITEM "回復(&R)", 61728 + MENUITEM "移動(&M)", 61456 + MENUITEM "大小(&S)", 61440 + MENUITEM "最小化(&N)", 61472 + MENUITEM "最大化(&X)", 61488 MENUITEM SEPARATOR - MENUITEM "êPé](&N)\tAlt-F4", 61536 + MENUITEM "關閉(&N)\tAlt-F4", 61536 MENUITEM SEPARATOR - MENUITEM "ÇГQµ½(&S)...\tCtrl-Esc", 61744 + MENUITEM "切換到(&S)...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "¹ØÓÚWine (&A)...", 61761 + MENUITEM "关于Wine (&A)...", 61761 } EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE { POPUP "" BEGIN - MENUITEM "»Ø�Í(&U)", EM_UNDO + MENUITEM "恢复(&U)", EM_UNDO MENUITEM SEPARATOR - MENUITEM "¼ôÏÂ(&T)", WM_CUT - MENUITEM "�ÍÑu(&C)", WM_COPY - MENUITEM "ÙNÉÏ(&P)", WM_PASTE - MENUITEM "„h³ý(&D)", WM_CLEAR + MENUITEM "剪下(&T)", WM_CUT + MENUITEM "復製(&C)", WM_COPY + MENUITEM "貼上(&P)", WM_PASTE + MENUITEM "刪除(&D)", WM_CLEAR MENUITEM SEPARATOR - MENUITEM "È«ßx(&A)", EM_SETSEL + MENUITEM "全選(&A)", EM_SETSEL END } @@ -119,32 +124,32 @@ STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS BEGIN ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP | SS_NOPREFIX - PUSHBUTTON "´_¶¨(&O)", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "È¡Ïû(&C)", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÖÐÖ¹(&A)", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÖØÔ‡(&R)", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ºöÂÔ(&I)", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "ÊÇ(&Y)", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "·ñ(&N)", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "&Try Again", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "&Continue", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "Help", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "確定(&O)", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "取消(&C)", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "中止(&A)", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "重試(&R)", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "忽略(&I)", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "是(&Y)", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "否(&N)", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "再試(&T)", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "繼續(&C)", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "幫助", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END MDI_MOREWINDOWS DIALOG FIXED IMPURE 20, 20, 232, 122 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ßx“ñÒ•´°" -FONT 8, "MS Shell Dlg" +CAPTION "選擇視窗" +FONT 8, "PMingLiu" BEGIN LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in mdi.h */ - DEFPUSHBUTTON "´_¶¨", IDOK, 75, 100, 35, 14 - PUSHBUTTON "È¡Ïû", IDCANCEL, 120, 100, 35, 14 + DEFPUSHBUTTON "確定", IDOK, 75, 100, 35, 14 + PUSHBUTTON "取消", IDCANCEL, 120, 100, 35, 14 END STRINGTABLE DISCARDABLE { - IDS_ERROR "Error" - IDS_MDI_MOREWINDOWS "¸ü¶àÒ•´°(&M)..." + IDS_ERROR "错误" + IDS_MDI_MOREWINDOWS "更多視窗(&M)..." } #pragma code_page(default) diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c index 6b165600c79..0c611a34024 100644 --- a/dlls/user32/tests/cursoricon.c +++ b/dlls/user32/tests/cursoricon.c @@ -814,7 +814,6 @@ static void test_LoadImage(void) /* Test loading an icon as a cursor. */ SetLastError(0xdeadbeef); handle = LoadImageA(NULL, "icon.ico", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); - todo_wine ok(handle != NULL, "LoadImage() failed.\n"); error = GetLastError(); ok(error == 0, "Last error: %u\n", error); @@ -822,7 +821,6 @@ static void test_LoadImage(void) /* Test the icon information. */ SetLastError(0xdeadbeef); ret = GetIconInfo(handle, &icon_info); - todo_wine ok(ret, "GetIconInfo() failed.\n"); error = GetLastError(); ok(error == 0xdeadbeef, "Last error: %u\n", error); @@ -839,7 +837,6 @@ static void test_LoadImage(void) /* Clean up. */ SetLastError(0xdeadbeef); ret = DestroyCursor(handle); - todo_wine ok(ret, "DestroyCursor() failed.\n"); error = GetLastError(); ok(error == 0xdeadbeef, "Last error: %u\n", error); @@ -854,6 +851,99 @@ static void test_LoadImage(void) test_LoadImageFile(pngimage, sizeof(pngimage), "png", 0); } +static void test_CreateIconFromResource(void) +{ + HANDLE handle; + BOOL ret; + DWORD error; + BITMAPINFOHEADER *icon_header; + INT16 *hotspot; + ICONINFO icon_info; + +#define ICON_RES_WIDTH 32 +#define ICON_RES_HEIGHT 32 +#define ICON_RES_AND_SIZE (ICON_WIDTH*ICON_HEIGHT/8) +#define ICON_RES_BPP 32 +#define ICON_RES_SIZE \ + (sizeof(BITMAPINFOHEADER) + ICON_AND_SIZE + ICON_AND_SIZE*ICON_BPP) +#define CRSR_RES_SIZE (2*sizeof(INT16) + ICON_RES_SIZE) + + /* Set icon data. */ + hotspot = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, CRSR_RES_SIZE); + + /* Cursor resources have an extra hotspot, icon resources not. */ + hotspot[0] = 3; + hotspot[1] = 3; + + icon_header = (BITMAPINFOHEADER *) (hotspot + 2); + icon_header->biSize = sizeof(BITMAPINFOHEADER); + icon_header->biWidth = ICON_WIDTH; + icon_header->biHeight = ICON_HEIGHT*2; + icon_header->biPlanes = 1; + icon_header->biBitCount = ICON_BPP; + icon_header->biSizeImage = 0; /* Uncompressed bitmap. */ + + /* Test creating a cursor. */ + SetLastError(0xdeadbeef); + handle = CreateIconFromResource((PBYTE) hotspot, CRSR_RES_SIZE, FALSE, 0x00030000); + ok(handle != NULL, "Create cursor failed.\n"); + + /* Test the icon information. */ + SetLastError(0xdeadbeef); + ret = GetIconInfo(handle, &icon_info); + ok(ret, "GetIconInfo() failed.\n"); + error = GetLastError(); + ok(error == 0xdeadbeef, "Last error: %u\n", error); + + if (ret) + { + ok(icon_info.fIcon == FALSE, "fIcon != FALSE.\n"); + ok(icon_info.xHotspot == 3, "xHotspot is %u.\n", icon_info.xHotspot); + ok(icon_info.yHotspot == 3, "yHotspot is %u.\n", icon_info.yHotspot); + ok(icon_info.hbmColor != NULL, "No hbmColor!\n"); + ok(icon_info.hbmMask != NULL, "No hbmMask!\n"); + } + + /* Clean up. */ + SetLastError(0xdeadbeef); + ret = DestroyCursor(handle); + ok(ret, "DestroyCursor() failed.\n"); + error = GetLastError(); + ok(error == 0xdeadbeef, "Last error: %u\n", error); + + /* Test creating an icon. */ + SetLastError(0xdeadbeef); + handle = CreateIconFromResource((PBYTE) icon_header, ICON_RES_SIZE, TRUE, + 0x00030000); + ok(handle != NULL, "Create icon failed.\n"); + + /* Test the icon information. */ + SetLastError(0xdeadbeef); + ret = GetIconInfo(handle, &icon_info); + ok(ret, "GetIconInfo() failed.\n"); + error = GetLastError(); + ok(error == 0xdeadbeef, "Last error: %u\n", error); + + if (ret) + { + ok(icon_info.fIcon == TRUE, "fIcon != TRUE.\n"); + /* Icons always have hotspot in the middle */ + ok(icon_info.xHotspot == ICON_WIDTH/2, "xHotspot is %u.\n", icon_info.xHotspot); + ok(icon_info.yHotspot == ICON_HEIGHT/2, "yHotspot is %u.\n", icon_info.yHotspot); + ok(icon_info.hbmColor != NULL, "No hbmColor!\n"); + ok(icon_info.hbmMask != NULL, "No hbmMask!\n"); + } + + /* Clean up. */ + SetLastError(0xdeadbeef); + ret = DestroyCursor(handle); + ok(ret, "DestroyCursor() failed.\n"); + error = GetLastError(); + ok(error == 0xdeadbeef, "Last error: %u\n", error); + + HeapFree(GetProcessHeap(), 0, hotspot); +} + static void test_DestroyCursor(void) { static const BYTE bmp_bits[4096]; @@ -958,6 +1048,7 @@ START_TEST(cursoricon) test_initial_cursor(); test_CreateIcon(); test_LoadImage(); + test_CreateIconFromResource(); test_DestroyCursor(); do_parent(); test_child_process(); diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c index 0de9bff85b2..65d922edd7f 100644 --- a/dlls/user32/tests/monitor.c +++ b/dlls/user32/tests/monitor.c @@ -2,6 +2,7 @@ * Unit tests for monitor APIs * * Copyright 2005 Huw Davies + * Copyright 2008 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -61,7 +62,7 @@ static BOOL CALLBACK monitor_enum_proc(HMONITOR hmon, HDC hdc, LPRECT lprc, mi.cbSize = sizeof(mi); ok(pGetMonitorInfoA(hmon, (MONITORINFO*)&mi), "GetMonitorInfo failed\n"); - if(mi.dwFlags == MONITORINFOF_PRIMARY) + if (mi.dwFlags & MONITORINFOF_PRIMARY) strcpy(primary, mi.szDevice); return TRUE; @@ -73,9 +74,15 @@ static void test_enumdisplaydevices(void) char primary_device_name[32]; char primary_monitor_device_name[32]; DWORD primary_num = -1, num = 0; + BOOL ret; + + if (!pEnumDisplayDevicesA) + { + skip("EnumDisplayDevicesA is not available\n"); + return; + } dd.cb = sizeof(dd); - if(pEnumDisplayDevicesA == NULL) return; while(1) { BOOL ret; @@ -99,14 +106,18 @@ static void test_enumdisplaydevices(void) } ok(primary_num != -1, "Didn't get the primary device\n"); - if(pEnumDisplayMonitors && pGetMonitorInfoA) { - ok(pEnumDisplayMonitors(NULL, NULL, monitor_enum_proc, (LPARAM)primary_monitor_device_name), - "EnumDisplayMonitors failed\n"); - - ok(!strcmp(primary_monitor_device_name, primary_device_name), - "monitor device name %s, device name %s\n", primary_monitor_device_name, - primary_device_name); + if (!pEnumDisplayMonitors || !pGetMonitorInfoA) + { + skip("EnumDisplayMonitors or GetMonitorInfoA are not available\n"); + return; } + + primary_monitor_device_name[0] = 0; + ret = pEnumDisplayMonitors(NULL, NULL, monitor_enum_proc, (LPARAM)primary_monitor_device_name); + ok(ret, "EnumDisplayMonitors failed\n"); + ok(!strcmp(primary_monitor_device_name, primary_device_name), + "monitor device name %s, device name %s\n", primary_monitor_device_name, + primary_device_name); } struct vid_mode @@ -267,6 +278,12 @@ static void test_monitors(void) HMONITOR monitor, primary; POINT pt; + if (!pMonitorFromPoint || !pMonitorFromWindow) + { + skip("MonitorFromPoint or MonitorFromWindow are not available\n"); + return; + } + pt.x = pt.y = 0; primary = pMonitorFromPoint( pt, MONITOR_DEFAULTTOPRIMARY ); ok( primary != 0, "couldn't get primary monitor\n" ); @@ -279,15 +296,96 @@ static void test_monitors(void) ok( monitor == primary, "got %p, should get primary %p for MONITOR_DEFAULTTONEAREST\n", monitor, primary ); } +static BOOL CALLBACK find_primary_mon(HMONITOR hmon, HDC hdc, LPRECT rc, LPARAM lp) +{ + MONITORINFO mi; + BOOL ret; + + mi.cbSize = sizeof(mi); + ret = pGetMonitorInfoA(hmon, &mi); + ok(ret, "GetMonitorInfo failed\n"); + if (mi.dwFlags & MONITORINFOF_PRIMARY) + { + *(HMONITOR *)lp = hmon; + return FALSE; + } + return TRUE; +} + +static void test_work_area(void) +{ + HMONITOR hmon; + MONITORINFO mi; + RECT rc_work, rc_normal; + HWND hwnd; + WINDOWPLACEMENT wp; + BOOL ret; + + if (!pEnumDisplayMonitors || !pGetMonitorInfoA) + { + skip("EnumDisplayMonitors or GetMonitorInfoA are not available\n"); + return; + } + + hmon = 0; + ret = pEnumDisplayMonitors(NULL, NULL, find_primary_mon, (LPARAM)&hmon); + ok(!ret && hmon != 0, "Failed to find primary monitor\n"); + + mi.cbSize = sizeof(mi); + SetLastError(0xdeadbeef); + ret = pGetMonitorInfoA(hmon, &mi); + ok(ret, "GetMonitorInfo error %u\n", GetLastError()); + ok(mi.dwFlags & MONITORINFOF_PRIMARY, "not a primary monitor\n"); + trace("primary monitor (%d,%d-%d,%d)\n", + mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right, mi.rcMonitor.bottom); + + SetLastError(0xdeadbeef); + ret = SystemParametersInfo(SPI_GETWORKAREA, 0, &rc_work, 0); + ok(ret, "SystemParametersInfo error %u\n", GetLastError()); + trace("work area (%d,%d-%d,%d)\n", rc_work.left, rc_work.top, rc_work.right, rc_work.bottom); + ok(EqualRect(&rc_work, &mi.rcWork), "work area is different\n"); + + hwnd = CreateWindowEx(0, "static", NULL, WS_OVERLAPPEDWINDOW|WS_VISIBLE,100,100,10,10,0,0,0,NULL); + ok(hwnd != 0, "CreateWindowEx failed\n"); + + ret = GetWindowRect(hwnd, &rc_normal); + ok(ret, "GetWindowRect failed\n"); + trace("normal (%d,%d-%d,%d)\n", rc_normal.left, rc_normal.top, rc_normal.right, rc_normal.bottom); + + wp.length = sizeof(wp); + ret = GetWindowPlacement(hwnd, &wp); + ok(ret, "GetWindowPlacement failed\n"); + trace("min: %d,%d max %d,%d normal %d,%d-%d,%d\n", + wp.ptMinPosition.x, wp.ptMinPosition.y, + wp.ptMaxPosition.x, wp.ptMaxPosition.y, + wp.rcNormalPosition.left, wp.rcNormalPosition.top, + wp.rcNormalPosition.right, wp.rcNormalPosition.bottom); + OffsetRect(&rc_normal, -rc_work.left, -rc_work.top); + if (!EqualRect(&mi.rcMonitor, &mi.rcWork)) /* FIXME: remove once Wine is fixed */ + todo_wine ok(EqualRect(&rc_normal, &wp.rcNormalPosition), "normal pos is different\n"); + else + ok(EqualRect(&rc_normal, &wp.rcNormalPosition), "normal pos is different\n"); + + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW); + + wp.length = sizeof(wp); + ret = GetWindowPlacement(hwnd, &wp); + ok(ret, "GetWindowPlacement failed\n"); + trace("min: %d,%d max %d,%d normal %d,%d-%d,%d\n", + wp.ptMinPosition.x, wp.ptMinPosition.y, + wp.ptMaxPosition.x, wp.ptMaxPosition.y, + wp.rcNormalPosition.left, wp.rcNormalPosition.top, + wp.rcNormalPosition.right, wp.rcNormalPosition.bottom); + ok(EqualRect(&rc_normal, &wp.rcNormalPosition), "normal pos is different\n"); + + DestroyWindow(hwnd); +} START_TEST(monitor) { init_function_pointers(); test_enumdisplaydevices(); test_ChangeDisplaySettingsEx(); - - if (pMonitorFromPoint && pMonitorFromWindow) - test_monitors(); - else - skip("MonitorFromPoint and/or MonitorFromWindow are not available\n"); + test_monitors(); + test_work_area(); } diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 7480e1b375a..62cc2dce881 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -1584,6 +1584,7 @@ static int after_end_dialog, test_def_id; static int sequence_cnt, sequence_size; static struct message* sequence; static int log_all_parent_messages; +static int paint_loop_done; /* user32 functions */ static HWND (WINAPI *pGetAncestor)(HWND,UINT); @@ -7039,6 +7040,31 @@ static LRESULT WINAPI ShowWindowProcA(HWND hwnd, UINT message, WPARAM wParam, LP return ret; } +LRESULT WINAPI PaintLoopProcA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_CREATE: return 0; + case WM_PAINT: + { + MSG msg2; + static int i = 0; + + i++; + if (PeekMessageA(&msg2, 0, 0, 0, 1)) + { + TranslateMessage(&msg2); + DispatchMessage(&msg2); + } + i--; + if ( i == 0) + paint_loop_done = 1; + return DefWindowProcA(hWnd,msg,wParam,lParam); + } + } + return DefWindowProcA(hWnd,msg,wParam,lParam); +} + static BOOL RegisterWindowClasses(void) { WNDCLASSA cls; @@ -7072,6 +7098,10 @@ static BOOL RegisterWindowClasses(void) cls.lpszClassName = "SimpleWindowClass"; if(!RegisterClassA(&cls)) return FALSE; + cls.lpfnWndProc = PaintLoopProcA; + cls.lpszClassName = "PaintLoopWindowClass"; + if(!RegisterClassA(&cls)) return FALSE; + cls.style = CS_NOCLOSE; cls.lpszClassName = "NoCloseWindowClass"; if(!RegisterClassA(&cls)) return FALSE; @@ -11033,6 +11063,31 @@ static void test_menu_messages(void) DestroyMenu(hmenu); } + +static void test_paintingloop(void) +{ + HWND hwnd; + + paint_loop_done = 0; + hwnd = CreateWindowExA(0x0,"PaintLoopWindowClass", + "PaintLoopWindowClass",WS_OVERLAPPEDWINDOW, + 100, 100, 100, 100, 0, 0, 0, NULL ); + ok(hwnd != 0, "PaintLoop window error %u\n", GetLastError()); + ShowWindow(hwnd,SW_NORMAL); + SetFocus(hwnd); + + while (!paint_loop_done) + { + MSG msg; + if (PeekMessageA(&msg, 0, 0, 0, 1)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + DestroyWindow(hwnd); +} + START_TEST(msg) { BOOL ret; @@ -11116,6 +11171,7 @@ START_TEST(msg) test_nullCallback(); test_dbcs_wm_char(); test_menu_messages(); + test_paintingloop(); /* keep it the last test, under Windows it tends to break the tests * which rely on active/foreground windows being correct. */ diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 6de86e878b0..ac5ec416903 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -53,6 +53,7 @@ typedef struct tagWINDOWPROC #define WINPROC_HANDLE (~0UL >> 16) #define MAX_WINPROCS 8192 #define BUILTIN_WINPROCS 9 /* first BUILTIN_WINPROCS entries are reserved for builtin procs */ +#define MAX_WINPROC_RECURSION 64 WNDPROC EDIT_winproc_handle = 0; @@ -2177,6 +2178,7 @@ LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result, BOOL unicode, enum wm_char_mapping mapping ) { + struct user_thread_info *thread_info = get_user_thread_info(); WND *wndPtr; WINDOWPROC *proc; @@ -2192,6 +2194,9 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, if (!proc) return TRUE; + if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return FALSE; + thread_info->recursion_count++; + if (unicode) { if (proc->procW) @@ -2210,6 +2215,7 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, else WINPROC_CallProc32ATo16( call_window_proc16, hwnd, msg, wParam, lParam, result, proc->proc16 ); } + thread_info->recursion_count--; return TRUE; } diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c index 7c51d347240..068165e8f9d 100644 --- a/dlls/winealsa.drv/midi.c +++ b/dlls/winealsa.drv/midi.c @@ -1158,7 +1158,7 @@ static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* lstrcpynA(midiPortName, snd_seq_port_info_get_name(pinfo), MAXPNAMELEN-1); midiPortName[MAXPNAMELEN-1] = 0; } - MultiByteToWideChar(CP_ACP, 0, midiPortName, -1, + MultiByteToWideChar(CP_UNIXCP, 0, midiPortName, -1, MidiOutDev[MODM_NumDevs].caps.szPname, sizeof(MidiOutDev[MODM_NumDevs].caps.szPname) / sizeof(WCHAR)); @@ -1223,7 +1223,7 @@ static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* lstrcpynA(midiPortName, snd_seq_port_info_get_name(pinfo), MAXPNAMELEN-1); midiPortName[MAXPNAMELEN-1] = 0; } - MultiByteToWideChar(CP_ACP, 0, midiPortName, -1, + MultiByteToWideChar(CP_UNIXCP, 0, midiPortName, -1, MidiInDev[MIDM_NumDevs].caps.szPname, sizeof(MidiInDev[MIDM_NumDevs].caps.szPname) / sizeof(WCHAR)); MidiInDev[MIDM_NumDevs].state = 0; diff --git a/dlls/winealsa.drv/wavein.c b/dlls/winealsa.drv/wavein.c index af62bcf4ce7..603d62ce4ad 100644 --- a/dlls/winealsa.drv/wavein.c +++ b/dlls/winealsa.drv/wavein.c @@ -719,7 +719,7 @@ static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1) { TRACE("(%u, %p)\n", wDevID, dwParam1); - *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1, + *dwParam1 = MultiByteToWideChar(CP_UNIXCP, 0, WInDev[wDevID].interface_name, -1, NULL, 0 ) * sizeof(WCHAR); return MMSYSERR_NOERROR; } @@ -729,10 +729,10 @@ static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1) */ static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2) { - if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1, + if (dwParam2 >= MultiByteToWideChar(CP_UNIXCP, 0, WInDev[wDevID].interface_name, -1, NULL, 0 ) * sizeof(WCHAR)) { - MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1, + MultiByteToWideChar(CP_UNIXCP, 0, WInDev[wDevID].interface_name, -1, dwParam1, dwParam2 / sizeof(WCHAR)); return MMSYSERR_NOERROR; } diff --git a/dlls/winealsa.drv/waveinit.c b/dlls/winealsa.drv/waveinit.c index 1516aa63735..4bdaeff3d34 100644 --- a/dlls/winealsa.drv/waveinit.c +++ b/dlls/winealsa.drv/waveinit.c @@ -490,7 +490,7 @@ static int ALSA_AddPlaybackDevice(snd_ctl_t *ctl, snd_pcm_t *pcm, const char *pc if (rc) return(rc); - MultiByteToWideChar(CP_ACP, 0, wwo.ds_desc.szDesc, -1, + MultiByteToWideChar(CP_UNIXCP, 0, wwo.ds_desc.szDesc, -1, wwo.outcaps.szPname, sizeof(wwo.outcaps.szPname)/sizeof(WCHAR)); wwo.outcaps.szPname[sizeof(wwo.outcaps.szPname)/sizeof(WCHAR) - 1] = '\0'; @@ -530,7 +530,7 @@ static int ALSA_AddCaptureDevice(snd_ctl_t *ctl, snd_pcm_t *pcm, const char *pcm if (rc) return(rc); - MultiByteToWideChar(CP_ACP, 0, wwi.ds_desc.szDesc, -1, + MultiByteToWideChar(CP_UNIXCP, 0, wwi.ds_desc.szDesc, -1, wwi.incaps.szPname, sizeof(wwi.incaps.szPname) / sizeof(WCHAR)); wwi.incaps.szPname[sizeof(wwi.incaps.szPname)/sizeof(WCHAR) - 1] = '\0'; diff --git a/dlls/winealsa.drv/waveout.c b/dlls/winealsa.drv/waveout.c index 8f18d3c1660..9dae6f405ac 100644 --- a/dlls/winealsa.drv/waveout.c +++ b/dlls/winealsa.drv/waveout.c @@ -1131,7 +1131,7 @@ static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1) { TRACE("(%u, %p)\n", wDevID, dwParam1); - *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1, + *dwParam1 = MultiByteToWideChar(CP_UNIXCP, 0, WOutDev[wDevID].interface_name, -1, NULL, 0 ) * sizeof(WCHAR); return MMSYSERR_NOERROR; } @@ -1141,10 +1141,10 @@ static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1) */ static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2) { - if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1, + if (dwParam2 >= MultiByteToWideChar(CP_UNIXCP, 0, WOutDev[wDevID].interface_name, -1, NULL, 0 ) * sizeof(WCHAR)) { - MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1, + MultiByteToWideChar(CP_UNIXCP, 0, WOutDev[wDevID].interface_name, -1, dwParam1, dwParam2 / sizeof(WCHAR)); return MMSYSERR_NOERROR; } diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index eb3eed8ca05..2f18ddce71f 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -645,15 +645,15 @@ static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, const c case WINED3DFMT_V16U16: if(GL_SUPPORT(NV_TEXTURE_SHADER) || (GL_SUPPORT(ATI_ENVMAP_BUMPMAP) && fmt == WINED3DFMT_V8U8)) { -#if 0 - /* The 3rd channel returns 1.0 in d3d, but 0.0 in gl. Fix this while we're at it :-) - * disabled until an application that needs it is found because it causes unneeded - * shader recompilation in some game - */ - if(strlen(writemask) >= 4) { - shader_addline(buffer, "MOV %s.%c, %s;\n", reg, one); + if(0) { + /* The 3rd channel returns 1.0 in d3d, but 0.0 in gl. Fix this while we're at it :-) + * disabled until an application that needs it is found because it causes unneeded + * shader recompilation in some game + */ + if(strlen(writemask) >= 4) { + shader_addline(buffer, "MOV %s.%c, %s;\n", reg, writemask[3], one); + } } -#endif } else { /* Correct the sign, but leave the blue as it is - it was loaded correctly already * ARB shaders are a bit picky wrt writemasks and swizzles. If we're free to scale @@ -2066,7 +2066,8 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; shader_reg_maps* reg_maps = &This->baseShader.reg_maps; CONST DWORD *function = This->baseShader.function; - WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device; + WineD3D_GL_Info *gl_info = &device->adapter->gl_info; local_constant* lconst; /* Create the hw ARB shader */ @@ -2100,7 +2101,7 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF if(!GL_SUPPORT(NV_VERTEX_PROGRAM)) { shader_addline(buffer, "MOV result.color.secondary, -helper_const.wwwy;\n"); - if((GLINFO_LOCATION).set_texcoord_w) { + if((GLINFO_LOCATION).set_texcoord_w && !device->frag_pipe->ffp_proj_control) { int i; for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { if(This->baseShader.reg_maps.texcoord_mask[i] != 0 && @@ -2746,11 +2747,12 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB if(settings->op[stage].projected == proj_none) { instr = "TEX"; - } else if(settings->op[stage].projected == proj_count4) { + } else if(settings->op[stage].projected == proj_count4 || + settings->op[stage].projected == proj_count3) { instr = "TXP"; } else { + FIXME("Unexpected projection mode %d\n", settings->op[stage].projected); instr = "TXP"; - ERR("Implement proj_count3\n"); } if(stage > 0 && @@ -2768,7 +2770,11 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB /* Note: Currently always divide by .a because the vertex pipeline moves the correct value * into the 4th component */ - shader_addline(&buffer, "RCP arg1.a, fragment.texcoord[%u].a;\n", stage); + if(settings->op[stage].projected == proj_count4) { + shader_addline(&buffer, "RCP arg1.a, fragment.texcoord[%u].a;\n", stage); + } else { + shader_addline(&buffer, "RCP arg1.a, fragment.texcoord[%u].b;\n", stage); + } shader_addline(&buffer, "MUL arg1.rg, fragment.texcoord[%u], arg1.a;\n", stage); shader_addline(&buffer, "ADD ret, ret, arg1;\n"); } else { @@ -2782,6 +2788,11 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB stage - 1, stage - 1, stage - 1); shader_addline(&buffer, "MUL tex%u, tex%u, ret.r;\n", stage, stage); } + } else if(settings->op[stage].projected == proj_count3) { + shader_addline(&buffer, "MOV ret, fragment.texcoord[%u];\n", stage); + shader_addline(&buffer, "MOV ret.a, ret.b;\n"); + shader_addline(&buffer, "%s%s tex%u, ret, texture[%u], %s;\n", + instr, sat, stage, stage, textype); } else { shader_addline(&buffer, "%s%s tex%u, fragment.texcoord[%u], texture[%u], %s;\n", instr, sat, stage, stage, stage, textype); @@ -2962,6 +2973,12 @@ static void state_arbfp_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, Win } } +static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + if(!isStateDirty(context, STATE_PIXELSHADER)) { + fragment_prog_arbfp(state, stateblock, context); + } +} + #undef GLINFO_LOCATION static const struct StateEntryTemplate arbfp_fragmentstate_template[] = { @@ -3099,6 +3116,14 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] = { { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 0 }, { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 0 }, { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 }, + {STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, {0 /* Terminate */, { 0, 0 }, 0 }, }; @@ -3108,7 +3133,8 @@ const struct fragment_pipeline arbfp_fragment_pipeline = { arbfp_alloc, arbfp_free, shader_arb_conv_supported, - arbfp_fragmentstate_template + arbfp_fragmentstate_template, + TRUE /* We can disable projected textures */ }; #define GLINFO_LOCATION device->adapter->gl_info diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c index 667a95c71c4..20c4ebef495 100644 --- a/dlls/wined3d/ati_fragment_shader.c +++ b/dlls/wined3d/ati_fragment_shader.c @@ -50,7 +50,7 @@ struct atifs_ffp_desc struct atifs_private_data { - hash_table_t *fragment_shaders; /* A hashtable to track fragment pipeline replacement shaders */ + struct hash_table_t *fragment_shaders; /* A hashtable to track fragment pipeline replacement shaders */ }; @@ -312,11 +312,18 @@ static GLuint gen_ati_shader(struct texture_stage_op op[MAX_TEXTURES], WineD3D_G GL_EXTCALL(glSampleMapATI(GL_REG_0_ATI + stage, GL_TEXTURE0_ARB + stage, GL_SWIZZLE_STR_ATI)); - TRACE("glPassTexCoordATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, GL_SWIZZLE_STR_ATI)\n", - stage + 1, stage + 1); + if(op[stage + 1].projected == proj_none) { + swizzle = GL_SWIZZLE_STR_ATI; + } else if(op[stage + 1].projected == proj_count4) { + swizzle = GL_SWIZZLE_STQ_DQ_ATI; + } else { + swizzle = GL_SWIZZLE_STR_DR_ATI; + } + TRACE("glPassTexCoordATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, %s)\n", + stage + 1, stage + 1, debug_swizzle(swizzle)); GL_EXTCALL(glPassTexCoordATI(GL_REG_0_ATI + stage + 1, GL_TEXTURE0_ARB + stage + 1, - GL_SWIZZLE_STR_ATI)); + swizzle)); /* We need GL_REG_5_ATI as a temporary register to swizzle the bump matrix. So we run into * issues if we're bump mapping on stage 4 or 5 @@ -377,15 +384,7 @@ static GLuint gen_ati_shader(struct texture_stage_op op[MAX_TEXTURES], WineD3D_G if(op[stage].projected == proj_none) { swizzle = GL_SWIZZLE_STR_ATI; } else if(op[stage].projected == proj_count3) { - /* TODO: D3DTTFF_COUNT3 | D3DTTFF_PROJECTED would be GL_SWIZZLE_STR_DR_ATI. - * However, the FFP vertex processing texture transform matrix handler does - * some transformations in the texture matrix which makes the 3rd coordinate - * arrive in Q, not R in that case. This is needed for opengl fixed function - * fragment processing which always divides by Q. In this backend we can - * handle that properly and be compatible with vertex shader output and avoid - * side effects of the texture matrix games - */ - swizzle = GL_SWIZZLE_STQ_DQ_ATI; + swizzle = GL_SWIZZLE_STR_DR_ATI; } else { swizzle = GL_SWIZZLE_STQ_DQ_ATI; } @@ -870,6 +869,13 @@ static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), (float *) mat)); checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), mat)"); } + +static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + if(!isStateDirty(context, STATE_PIXELSHADER)) { + set_tex_op_atifs(state, stateblock, context); + } +} + #undef GLINFO_LOCATION static const struct StateEntryTemplate atifs_fragmentstate_template[] = { @@ -986,6 +992,14 @@ static const struct StateEntryTemplate atifs_fragmentstate_template[] = { { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, 0 }, { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, 0 }, { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, 0 }, + {STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, {0 /* Terminate */, { 0, 0 }, 0 }, }; @@ -1102,5 +1116,6 @@ const struct fragment_pipeline atifs_fragment_pipeline = { atifs_alloc, atifs_free, atifs_conv_supported, - atifs_fragmentstate_template + atifs_fragmentstate_template, + TRUE /* We can disable projected textures */ }; diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c index d4025866e7a..26940f4340b 100644 --- a/dlls/wined3d/basetexture.c +++ b/dlls/wined3d/basetexture.c @@ -330,26 +330,6 @@ HRESULT WINAPI IWineD3DBaseTextureImpl_BindTexture(IWineD3DBaseTexture *iface) { return hr; } -HRESULT WINAPI IWineD3DBaseTextureImpl_UnBindTexture(IWineD3DBaseTexture *iface) { - IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; - UINT textureDimensions; - - TRACE("(%p) : About to bind texture\n", This); - textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); - - ENTER_GL(); - - glBindTexture(textureDimensions, 0); -#if 0 /* TODO: context manager support */ - IWineD3DContextManager_PopState(This->contextManager, textureDimensions, ENABLED, NOW /* make sure the state is applied now */); -#else - glDisable(textureDimensions); -#endif - - LEAVE_GL(); - return WINED3D_OK; -} - UINT WINAPI IWineD3DBaseTextureImpl_GetTextureDimensions(IWineD3DBaseTexture *iface){ IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; FIXME("(%p) : This shouldn't be called\n", This); @@ -537,7 +517,6 @@ static const IWineD3DBaseTextureVtbl IWineD3DBaseTexture_Vtbl = IWineD3DBaseTextureImpl_GetDirty, /* internal */ IWineD3DBaseTextureImpl_BindTexture, - IWineD3DBaseTextureImpl_UnBindTexture, IWineD3DBaseTextureImpl_GetTextureDimensions, IWineD3DBaseTextureImpl_IsCondNP2, IWineD3DBaseTextureImpl_ApplyStateChanges diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index fb3fcc48c10..66206bd3e99 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -740,10 +740,6 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex /* Disable all textures. The caller can then bind a texture it wants to blit * from */ - if(GL_SUPPORT(NV_REGISTER_COMBINERS)) { - glDisable(GL_REGISTER_COMBINERS_NV); - checkGLcall("glDisable(GL_REGISTER_COMBINERS_NV)"); - } if (GL_SUPPORT(ARB_MULTITEXTURE)) { /* The blitting code uses (for now) the fixed function pipeline, so make sure to reset all fixed * function texture unit. No need to care for higher samplers @@ -855,11 +851,6 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE), StateTable); checkGLcall("glDisable(GL_COLOR_SUM_EXT)"); } - if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { - GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE), StateTable); - checkGLcall("glFinalCombinerInputNV"); - } /* Setup transforms */ glMatrixMode(GL_MODELVIEW); diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c index 39026df3b33..14d30404af4 100644 --- a/dlls/wined3d/cubetexture.c +++ b/dlls/wined3d/cubetexture.c @@ -254,12 +254,6 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *i return hr; } -static HRESULT WINAPI IWineD3DCubeTextureImpl_UnBindTexture(IWineD3DCubeTexture *iface) { - IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; - TRACE("(%p) : relay to BaseTexture\n", This); - return IWineD3DBaseTextureImpl_UnBindTexture((IWineD3DBaseTexture *)iface); -} - static UINT WINAPI IWineD3DCubeTextureImpl_GetTextureDimensions(IWineD3DCubeTexture *iface){ IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; TRACE("(%p)\n", This); @@ -409,7 +403,6 @@ const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = IWineD3DCubeTextureImpl_SetDirty, IWineD3DCubeTextureImpl_GetDirty, IWineD3DCubeTextureImpl_BindTexture, - IWineD3DCubeTextureImpl_UnBindTexture, IWineD3DCubeTextureImpl_GetTextureDimensions, IWineD3DCubeTextureImpl_IsCondNP2, IWineD3DCubeTextureImpl_ApplyStateChanges, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e57c0c86b3d..e19f0cfad5b 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2172,10 +2172,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR ENTER_GL(); -#if 0 - IWineD3DImpl_CheckGraphicsMemory(); -#endif - { /* Set a default viewport */ WINED3DVIEWPORT vp; vp.X = 0; @@ -3750,7 +3746,8 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) { device_update_fixed_function_usage_map(This); - if (!GL_SUPPORT(NV_REGISTER_COMBINERS) || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) { + if (This->max_ffp_textures == This->max_ffp_texture_stages || + This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) { for (i = 0; i < This->stateBlock->lowest_disabled_stage; ++i) { if (!This->fixed_function_usage_map[i]) continue; @@ -4603,9 +4600,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if This->stateBlock->lowest_disabled_stage = i; TRACE("New lowest disabled: %d\n", i); } - if(GL_SUPPORT(NV_REGISTER_COMBINERS) && !This->stateBlock->pixelShader) { - /* TODO: Built a stage -> texture unit mapping for register combiners */ - } } IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(Stage, Type)); @@ -7596,12 +7590,6 @@ static void WINAPI IWineD3DDeviceImpl_ResourceReleased(IWineD3DDevice *iface, IW This->stateBlock->streamSource[streamNumber] = 0; } } -#if 0 /* TODO: Manage internal tracking properly so that 'this shouldn't happen' */ - else { /* This shouldn't happen */ - FIXME("Calling application has released the device before relasing all the resources bound to the device\n"); - } -#endif - } } break; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 356dd5288c3..d26940600f0 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2202,7 +2202,6 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WINE case WINED3DFMT_X1R5G5B5: case WINED3DFMT_A1R5G5B5: case WINED3DFMT_A4R4G4B4: - case WINED3DFMT_R3G3B2: case WINED3DFMT_A8: case WINED3DFMT_X4R4G4B4: case WINED3DFMT_A8B8G8R8: @@ -2213,6 +2212,10 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WINE TRACE_(d3d_caps)("[OK]\n"); return TRUE; + case WINED3DFMT_R3G3B2: + TRACE_(d3d_caps)("[FAILED] - Not supported on Windows\n"); + return FALSE; + /***** * supported: Palettized */ @@ -2320,6 +2323,9 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WINE } TRACE_(d3d_caps)("[FAILED]\n"); return FALSE; + case WINED3DFMT_YV12: + TRACE_(d3d_caps)("[FAILED]\n"); + return FALSE; /* Not supported */ case WINED3DFMT_A16B16G16R16: @@ -2394,6 +2400,17 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WINE TRACE_(d3d_caps)("[FAILED]\n"); return FALSE; + case WINED3DFMT_NVHU: + case WINED3DFMT_NVHS: + /* These formats seem to be similar to the HILO formats in GL_NV_texture_shader. NVHU + * is said to be GL_UNSIGNED_HILO16, NVHS GL_SIGNED_HILO16. Rumours say that d3d computes + * a 3rd channel similarly to D3DFMT_CxV8U8(So NVHS could be called D3DFMT_CxV16U16). + * ATI refused to support formats which can easilly be emulated with pixel shaders, so + * Applications have to deal with not having NVHS and NVHU. + */ + TRACE_(d3d_caps)("[FAILED]\n"); + return FALSE; + case WINED3DFMT_UNKNOWN: return FALSE; @@ -3249,12 +3266,14 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, } else pCaps->VolumeTextureAddressCaps = 0; - pCaps->LineCaps = WINED3DLINECAPS_TEXTURE | - WINED3DLINECAPS_ZTEST; - /* FIXME: Add - WINED3DLINECAPS_BLEND - WINED3DLINECAPS_ALPHACMP - WINED3DLINECAPS_FOG */ + pCaps->LineCaps = WINED3DLINECAPS_TEXTURE | + WINED3DLINECAPS_ZTEST | + WINED3DLINECAPS_BLEND | + WINED3DLINECAPS_ALPHACMP | + WINED3DLINECAPS_FOG; + /* WINED3DLINECAPS_ANTIALIAS is not supported on Windows, and dx and gl seem to have a different + * idea how generating the smoothing alpha values works; the result is different + */ pCaps->MaxTextureWidth = GL_LIMITS(texture_size); pCaps->MaxTextureHeight = GL_LIMITS(texture_size); @@ -3603,6 +3622,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, object->frag_pipe = frag_pipeline; frag_pipeline->get_caps(DeviceType, &GLINFO_LOCATION, &ffp_caps); object->max_ffp_textures = ffp_caps.MaxSimultaneousTextures; + object->max_ffp_texture_stages = ffp_caps.MaxTextureBlendStages; compile_state_table(object->StateTable, object->multistate_funcs, &GLINFO_LOCATION, ffp_vertexstate_template, frag_pipeline, misc_state_template); diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index a3a371741b6..fb4495131c3 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -32,14 +32,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw); #include #include -#if 0 /* TODO */ -extern IWineD3DVertexShaderImpl* VertexShaders[64]; -extern IWineD3DVertexDeclarationImpl* VertexShaderDeclarations[64]; -extern IWineD3DPixelShaderImpl* PixelShaders[64]; - -#undef GL_VERSION_1_4 /* To be fixed, caused by mesa headers */ -#endif - /* Issues the glBegin call for gl given the primitive type and count */ static DWORD primitiveToGl(WINED3DPRIMITIVETYPE PrimitiveType, DWORD NumPrimitives, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index ee38ffc51c0..e89dbf30398 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -3008,6 +3008,7 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs GLhandleARB ret = 0; IWineD3DVertexShaderImpl *vs = (IWineD3DVertexShaderImpl *) vertexshader; IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) pixelshader; + IWineD3DDeviceImpl *device; DWORD vs_major = vs ? WINED3DSHADER_VERSION_MAJOR(vs->baseShader.hex_version) : 0; DWORD ps_major = ps ? WINED3DSHADER_VERSION_MAJOR(ps->baseShader.hex_version) : 0; unsigned int i; @@ -3029,7 +3030,9 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs /* That one is easy: The vertex shader writes to the builtin varyings, the pixel shader reads from them. * Take care about the texcoord .w fixup though if we're using the fixed function fragment pipeline */ - if((GLINFO_LOCATION).set_texcoord_w && ps_major == 0 && vs_major > 0) { + device = (IWineD3DDeviceImpl *) vs->baseShader.device; + if((GLINFO_LOCATION).set_texcoord_w && ps_major == 0 && vs_major > 0 && + !device->frag_pipe->ffp_proj_control) { shader_addline(&buffer, "void order_ps_input() {\n"); for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { if(vs->baseShader.reg_maps.texcoord_mask[i] != 0 && diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c index 5f3666875c0..ca21ba0659d 100644 --- a/dlls/wined3d/nvidia_texture_shader.c +++ b/dlls/wined3d/nvidia_texture_shader.c @@ -810,7 +810,8 @@ const struct fragment_pipeline nvts_fragment_pipeline = { nvrc_fragment_alloc, nvrc_fragment_free, nvts_conv_supported, - nvrc_fragmentstate_template + nvrc_fragmentstate_template, + FALSE /* we cannot disable projected textures. The vertex pipe has to do it */ }; const struct fragment_pipeline nvrc_fragment_pipeline = { @@ -819,5 +820,6 @@ const struct fragment_pipeline nvrc_fragment_pipeline = { nvrc_fragment_alloc, nvrc_fragment_free, nvts_conv_supported, - nvrc_fragmentstate_template + nvrc_fragmentstate_template, + FALSE /* we cannot disable projected textures. The vertex pipe has to do it */ }; diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index 3a55df770e0..29cd36891cc 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -34,14 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); #define GLINFO_LOCATION ((IWineD3DDeviceImpl *) This->baseShader.device)->adapter->gl_info -#if 0 /* Must not be 1 in cvs version */ -# define PSTRACE(A) TRACE A -# define TRACE_VSVECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w) -#else -# define PSTRACE(A) -# define TRACE_VSVECTOR(name) -#endif - #define GLNAME_REQUIRE_GLSL ((const char *)1) static HRESULT WINAPI IWineD3DPixelShaderImpl_QueryInterface(IWineD3DPixelShader *iface, REFIID riid, LPVOID *ppobj) { diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 5b924204ea4..d97df5af0d3 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -1,3 +1,4 @@ + /* * Direct3D state management * @@ -3105,7 +3106,7 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext } static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { - DWORD texUnit = state - STATE_TRANSFORM(WINED3DTS_TEXTURE0); + DWORD texUnit = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[texUnit]; BOOL generated; int coordIdx; @@ -3139,7 +3140,8 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, W context->last_was_rhw, stateblock->wineD3DDevice->strided_streams.u.s.texCoords[coordIdx].dwStride ? stateblock->wineD3DDevice->strided_streams.u.s.texCoords[coordIdx].dwType: - WINED3DDECLTYPE_UNUSED); + WINED3DDECLTYPE_UNUSED, + stateblock->wineD3DDevice->frag_pipe->ffp_proj_control); /* The sampler applying function calls us if this changes */ if(context->lastWasPow2Texture[texUnit] && stateblock->textures[texUnit]) { @@ -3375,7 +3377,7 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine /* Update the texture matrix */ if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stage))) { - transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stage), stateblock, context); + transform_texture(STATE_TEXTURESTAGE(stage, WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); } if(!isStateDirty(context, STATE_VDECL) && context->namedArraysLoaded) { @@ -3407,10 +3409,6 @@ static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; - union { - DWORD d; - float f; - } tmpvalue; if(stateblock->pixelShader && stage != 0 && ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) { @@ -3422,35 +3420,6 @@ static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, W shaderconstant(STATE_PIXELSHADERCONSTANT, stateblock, context); } } - - tmpvalue.d = stateblock->textureState[stage][WINED3DTSS_BUMPENVLSCALE]; - if(tmpvalue.f != 0.0) { - FIXME("WINED3DTSS_BUMPENVLSCALE not supported yet\n"); - } -} - -static void tex_bumpenvloffset(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; - union { - DWORD d; - float f; - } tmpvalue; - - if(stateblock->pixelShader && stage != 0 && - ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) { - /* The pixel shader has to know the luminance offset. Do a constants update if it - * isn't scheduled anyway - */ - if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT) && - !isStateDirty(context, STATE_PIXELSHADER)) { - shaderconstant(STATE_PIXELSHADERCONSTANT, stateblock, context); - } - } - - tmpvalue.d = stateblock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET]; - if(tmpvalue.f != 0.0) { - FIXME("WINED3DTSS_BUMPENVLOFFSET not supported yet\n"); - } } static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { @@ -3481,7 +3450,7 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, W if(texIsPow2 || context->lastWasPow2Texture[sampler]) { context->lastWasPow2Texture[sampler] = texIsPow2; - transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stateblock->wineD3DDevice->texUnitMap[sampler]), stateblock, context); + transform_texture(STATE_TEXTURESTAGE(stateblock->wineD3DDevice->texUnitMap[sampler], WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); } } } @@ -4218,28 +4187,6 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, WineDirect3DVerte } } -#if 0 /* FOG ----------------------------------------------*/ - if (sd->u.s.fog.lpData || sd->u.s.fog.VBO) { - /* TODO: fog*/ - if (GL_SUPPORT(EXT_FOG_COORD) { - glEnableClientState(GL_FOG_COORDINATE_EXT); - (GL_EXTCALL)(FogCoordPointerEXT)( - WINED3D_ATR_GLTYPE(sd->u.s.fog.dwType), - sd->u.s.fog.dwStride, - sd->u.s.fog.lpData + stateblock->loadBaseVertexIndex * sd->u.s.fog.dwStride); - } else { - /* don't bother falling back to 'slow' as we don't support software FOG yet. */ - /* FIXME: fixme once */ - TRACE("Hardware support for FOG is not avaiable, FOG disabled.\n"); - } - } else { - if (GL_SUPPRT(EXT_FOR_COORD) { - /* make sure fog is disabled */ - glDisableClientState(GL_FOG_COORDINATE_EXT); - } - } -#endif - /* Point Size ----------------------------------------------*/ if (sd->u.s.pSize.lpData || sd->u.s.pSize.VBO) { @@ -4657,7 +4604,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W int i; for(i = 0; i < MAX_TEXTURES; i++) { if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + i))) { - transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + i), stateblock, context); + transform_texture(STATE_TEXTURESTAGE(i, WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); } } } @@ -4906,21 +4853,21 @@ const struct StateEntryTemplate misc_state_template[] = { { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 }, { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 }, { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, - { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset }, 0 }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 }, { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, 0 }, { STATE_INDEXBUFFER, { STATE_INDEXBUFFER, indexbuffer }, ARB_VERTEX_BUFFER_OBJECT }, @@ -5086,14 +5033,14 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = { /* Transform states follow */ { STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, 0 }, { STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TRANSFORM(WINED3DTS_TEXTURE0), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TRANSFORM(WINED3DTS_TEXTURE1), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TRANSFORM(WINED3DTS_TEXTURE2), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TRANSFORM(WINED3DTS_TEXTURE3), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TRANSFORM(WINED3DTS_TEXTURE4), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TRANSFORM(WINED3DTS_TEXTURE5), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TRANSFORM(WINED3DTS_TEXTURE6), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TRANSFORM(WINED3DTS_TEXTURE7), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_world }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_world }, 0 }, @@ -5350,14 +5297,14 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = { { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_world }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_world }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_world }, 0 }, - { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE0), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE1), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE2), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE3), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE4), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE5), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE6), transform_texture }, 0 }, - { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TRANSFORM(WINED3DTS_TEXTURE7), transform_texture }, 0 }, + { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, + { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 }, { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 }, { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 }, @@ -5620,7 +5567,8 @@ const struct fragment_pipeline ffp_fragment_pipeline = { ffp_fragment_alloc, ffp_fragment_free, ffp_conv_supported, - ffp_fragmentstate_template + ffp_fragmentstate_template, + FALSE /* we cannot disable projected textures. The vertex pipe has to do it */ }; static int num_handlers(APPLYSTATEFUNC *funcs) { diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index bd83541a523..4a4893ec8e6 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -254,12 +254,6 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface) { return hr; } -static HRESULT WINAPI IWineD3DTextureImpl_UnBindTexture(IWineD3DTexture *iface) { - IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; - TRACE("(%p) : relay to BaseTexture\n", This); - return IWineD3DBaseTextureImpl_UnBindTexture((IWineD3DBaseTexture *)iface); -} - static UINT WINAPI IWineD3DTextureImpl_GetTextureDimensions(IWineD3DTexture *iface) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; TRACE("(%p)\n", This); @@ -397,7 +391,6 @@ const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = IWineD3DTextureImpl_SetDirty, IWineD3DTextureImpl_GetDirty, IWineD3DTextureImpl_BindTexture, - IWineD3DTextureImpl_UnBindTexture, IWineD3DTextureImpl_GetTextureDimensions, IWineD3DTextureImpl_IsCondNP2, IWineD3DTextureImpl_ApplyStateChanges, diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 85015443806..31a1944cc32 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -44,7 +44,7 @@ static const StaticPixelFormatDesc formats[] = { /* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */ {WINED3DFMT_UYVY ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, {WINED3DFMT_YUY2 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, - {WINED3DFMT_YV12 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,0 ,0 ,TRUE }, + {WINED3DFMT_YV12 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT1 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT2 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT3 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, @@ -114,6 +114,8 @@ static const StaticPixelFormatDesc formats[] = { {WINED3DFMT_Q16W16V16U16,0x0 ,0x0 ,0x0 ,0x0 ,8 ,0 ,0 ,FALSE }, /* Vendor-specific formats */ {WINED3DFMT_ATI2N ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, + {WINED3DFMT_NVHU ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, + {WINED3DFMT_NVHS ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, }; typedef struct { @@ -375,12 +377,12 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info) gl_info->gl_formats[dst].conversion_group = WINED3DFMT_V16U16; } else { /* Blue = 1.0 fixup, disabled for now */ -#if 0 - dst = getFmtIdx(WINED3DFMT_V8U8); - gl_info->gl_formats[dst].conversion_group = WINED3DFMT_V8U8; - dst = getFmtIdx(WINED3DFMT_V16U16); - gl_info->gl_formats[dst].conversion_group = WINED3DFMT_V8U8; -#endif + if(0) { + dst = getFmtIdx(WINED3DFMT_V8U8); + gl_info->gl_formats[dst].conversion_group = WINED3DFMT_V8U8; + dst = getFmtIdx(WINED3DFMT_V16U16); + gl_info->gl_formats[dst].conversion_group = WINED3DFMT_V8U8; + } } if(!GL_SUPPORT(NV_TEXTURE_SHADER)) { @@ -528,6 +530,7 @@ const char* debug_d3dformat(WINED3DFORMAT fmt) { FMT_TO_STR(WINED3DFMT_A2W10V10U10); FMT_TO_STR(WINED3DFMT_UYVY); FMT_TO_STR(WINED3DFMT_YUY2); + FMT_TO_STR(WINED3DFMT_YV12); FMT_TO_STR(WINED3DFMT_DXT1); FMT_TO_STR(WINED3DFMT_DXT2); FMT_TO_STR(WINED3DFMT_DXT3); @@ -558,6 +561,8 @@ const char* debug_d3dformat(WINED3DFORMAT fmt) { FMT_TO_STR(WINED3DFMT_A32B32G32R32F); FMT_TO_STR(WINED3DFMT_CxV8U8); FMT_TO_STR(WINED3DFMT_ATI2N); + FMT_TO_STR(WINED3DFMT_NVHU); + FMT_TO_STR(WINED3DFMT_NVHS); #undef FMT_TO_STR default: { @@ -1161,7 +1166,8 @@ BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWO } /* Setup this textures matrix according to the texture flags*/ -void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype) +void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype, + BOOL ffp_proj_control) { float mat[16]; @@ -1182,15 +1188,17 @@ void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, B memcpy(mat, smat, 16 * sizeof(float)); if (flags & WINED3DTTFF_PROJECTED) { - switch (flags & ~WINED3DTTFF_PROJECTED) { - case WINED3DTTFF_COUNT2: - mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13]; - mat[1] = mat[5] = mat[9] = mat[13] = 0; - break; - case WINED3DTTFF_COUNT3: - mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14]; - mat[2] = mat[6] = mat[10] = mat[14] = 0; - break; + if(!ffp_proj_control) { + switch (flags & ~WINED3DTTFF_PROJECTED) { + case WINED3DTTFF_COUNT2: + mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13]; + mat[1] = mat[5] = mat[9] = mat[13] = 0; + break; + case WINED3DTTFF_COUNT3: + mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14]; + mat[2] = mat[6] = mat[10] = mat[14] = 0; + break; + } } } else { /* under directx the R/Z coord can be used for translation, under opengl we use the Q coord instead */ if(!calculatedCoords) { @@ -1226,23 +1234,25 @@ void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, B FIXME("Unexpected fixed function texture coord input\n"); } } - switch (flags & ~WINED3DTTFF_PROJECTED) { - /* case WINED3DTTFF_COUNT1: Won't ever get here */ - case WINED3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0; - /* OpenGL divides the first 3 vertex coord by the 4th by default, - * which is essentially the same as D3DTTFF_PROJECTED. Make sure that - * the 4th coord evaluates to 1.0 to eliminate that. - * - * If the fixed function pipeline is used, the 4th value remains unused, - * so there is no danger in doing this. With vertex shaders we have a - * problem. Should an app hit that problem, the code here would have to - * check for pixel shaders, and the shader has to undo the default gl divide. - * - * A more serious problem occurs if the app passes 4 coordinates in, and the - * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow - * or a replacement shader - */ - default: mat[3] = mat[7] = mat[11] = 0; mat[15] = 1; + if(!ffp_proj_control) { + switch (flags & ~WINED3DTTFF_PROJECTED) { + /* case WINED3DTTFF_COUNT1: Won't ever get here */ + case WINED3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0; + /* OpenGL divides the first 3 vertex coord by the 4th by default, + * which is essentially the same as D3DTTFF_PROJECTED. Make sure that + * the 4th coord evaluates to 1.0 to eliminate that. + * + * If the fixed function pipeline is used, the 4th value remains unused, + * so there is no danger in doing this. With vertex shaders we have a + * problem. Should an app hit that problem, the code here would have to + * check for pixel shaders, and the shader has to undo the default gl divide. + * + * A more serious problem occurs if the app passes 4 coordinates in, and the + * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow + * or a replacement shader + */ + default: mat[3] = mat[7] = mat[11] = 0; mat[15] = 1; + } } } @@ -1554,12 +1564,12 @@ BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4] /* Hash table functions */ -hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function) +struct hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function) { - hash_table_t *table; + struct hash_table_t *table; unsigned int initial_size = 8; - table = HeapAlloc(GetProcessHeap(), 0, sizeof(hash_table_t) + (initial_size * sizeof(struct list))); + table = HeapAlloc(GetProcessHeap(), 0, sizeof(struct hash_table_t) + (initial_size * sizeof(struct list))); if (!table) { ERR("Failed to allocate table, returning NULL.\n"); @@ -1597,7 +1607,7 @@ hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function return table; } -void hash_table_destroy(hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb) +void hash_table_destroy(struct hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb) { unsigned int i = 0; @@ -1614,7 +1624,7 @@ void hash_table_destroy(hash_table_t *table, void (*free_value)(void *value, voi HeapFree(GetProcessHeap(), 0, table); } -static inline struct hash_table_entry_t *hash_table_get_by_idx(hash_table_t *table, void *key, unsigned int idx) +static inline struct hash_table_entry_t *hash_table_get_by_idx(struct hash_table_t *table, void *key, unsigned int idx) { struct hash_table_entry_t *entry; @@ -1625,7 +1635,7 @@ static inline struct hash_table_entry_t *hash_table_get_by_idx(hash_table_t *tab return NULL; } -static BOOL hash_table_resize(hash_table_t *table, unsigned int new_bucket_count) +static BOOL hash_table_resize(struct hash_table_t *table, unsigned int new_bucket_count) { unsigned int new_entry_count = 0; struct hash_table_entry_t *new_entries; @@ -1684,7 +1694,7 @@ static BOOL hash_table_resize(hash_table_t *table, unsigned int new_bucket_count return TRUE; } -void hash_table_put(hash_table_t *table, void *key, void *value) +void hash_table_put(struct hash_table_t *table, void *key, void *value) { unsigned int idx; unsigned int hash; @@ -1757,12 +1767,12 @@ void hash_table_put(hash_table_t *table, void *key, void *value) ++table->count; } -void hash_table_remove(hash_table_t *table, void *key) +void hash_table_remove(struct hash_table_t *table, void *key) { hash_table_put(table, key, NULL); } -void *hash_table_get(hash_table_t *table, void *key) +void *hash_table_get(struct hash_table_t *table, void *key) { unsigned int idx; struct hash_table_entry_t *entry; @@ -1871,9 +1881,19 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting cop = WINED3DTOP_SELECTARG1; } - aarg1 = (args[aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff; - aarg2 = (args[aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff; - aarg0 = (args[aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff; + if(cop == WINED3DTOP_DOTPRODUCT3) { + /* A dotproduct3 on the colorop overwrites the alphaop operation and replicates + * the color result to the alpha component of the destination + */ + aop = cop; + aarg1 = carg1; + aarg2 = carg2; + aarg0 = carg0; + } else { + aarg1 = (args[aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff; + aarg2 = (args[aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff; + aarg0 = (args[aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff; + } if(i == 0 && stateblock->textures[0] && stateblock->renderState[WINED3DRS_COLORKEYENABLE] && @@ -1984,11 +2004,11 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting } #undef GLINFO_LOCATION -struct ffp_desc *find_ffp_shader(hash_table_t *fragment_shaders, struct ffp_settings *settings) +struct ffp_desc *find_ffp_shader(struct hash_table_t *fragment_shaders, struct ffp_settings *settings) { return (struct ffp_desc *)hash_table_get(fragment_shaders, settings);} -void add_ffp_shader(hash_table_t *shaders, struct ffp_desc *desc) { +void add_ffp_shader(struct hash_table_t *shaders, struct ffp_desc *desc) { struct ffp_settings *key = HeapAlloc(GetProcessHeap(), 0, sizeof(*key)); /* Note that the key is the implementation independent part of the ffp_desc structure, * whereas desc points to an extended structure with implementation specific parts. diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 5fab988546b..928b97dde3c 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -34,24 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); #define GLINFO_LOCATION ((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info -/* Shader debugging - Change the following line to enable debugging of software - vertex shaders */ -#if 0 /* Musxt not be 1 in cvs version */ -# define VSTRACE(A) TRACE A -# define TRACE_VSVECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w) -#else -# define VSTRACE(A) -# define TRACE_VSVECTOR(name) -#endif - -/** - * NVIDIA: DX8 Vertex Shader to NV Vertex Program - * http://developer.nvidia.com/view.asp?IO=vstovp - * - * NVIDIA: Memory Management with VAR - * http://developer.nvidia.com/view.asp?IO=var_memory_management - */ - /* TODO: Vertex and Pixel shaders are almost identical, the only exception being the way that some of the data is looked up or the availability of some of the data i.e. some instructions are only valid for pshaders and some for vshaders because of this the bulk of the software pipeline can be shared between pixel and vertex shaders... and it wouldn't surprise me if the program can be cross compiled using a large body of shared code */ diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c index de0bba7883d..2a0356d2e82 100644 --- a/dlls/wined3d/volumetexture.c +++ b/dlls/wined3d/volumetexture.c @@ -201,12 +201,6 @@ static HRESULT WINAPI IWineD3DVolumeTextureImpl_BindTexture(IWineD3DVolumeTextur return IWineD3DBaseTextureImpl_BindTexture((IWineD3DBaseTexture *)iface); } -static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnBindTexture(IWineD3DVolumeTexture *iface) { - IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; - TRACE("(%p) : relay to BaseTexture\n", This); - return IWineD3DBaseTextureImpl_UnBindTexture((IWineD3DBaseTexture *)iface); -} - static UINT WINAPI IWineD3DVolumeTextureImpl_GetTextureDimensions(IWineD3DVolumeTexture *iface) { IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; TRACE("(%p)\n", This); @@ -335,7 +329,6 @@ const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = IWineD3DVolumeTextureImpl_GetDirty, /* not in d3d */ IWineD3DVolumeTextureImpl_BindTexture, - IWineD3DVolumeTextureImpl_UnBindTexture, IWineD3DVolumeTextureImpl_GetTextureDimensions, IWineD3DVolumeTextureImpl_IsCondNP2, IWineD3DVolumeTextureImpl_ApplyStateChanges, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 8daee2d45b5..f4b81f7b27e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -54,7 +54,7 @@ struct hash_table_entry_t { struct list entry; }; -typedef struct { +struct hash_table_t { hash_function_t *hash_function; compare_function_t *compare_function; struct list *buckets; @@ -65,13 +65,13 @@ typedef struct { unsigned int count; unsigned int grow_size; unsigned int shrink_size; -} hash_table_t; +}; -hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function); -void hash_table_destroy(hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb); -void *hash_table_get(hash_table_t *table, void *key); -void hash_table_put(hash_table_t *table, void *key, void *value); -void hash_table_remove(hash_table_t *table, void *key); +struct hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function); +void hash_table_destroy(struct hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb); +void *hash_table_get(struct hash_table_t *table, void *key); +void hash_table_put(struct hash_table_t *table, void *key, void *value); +void hash_table_remove(struct hash_table_t *table, void *key); /* Device caps */ #define MAX_PALETTES 65536 @@ -257,7 +257,7 @@ extern const shader_backend_t none_shader_backend; /* GLSL shader private data */ struct shader_glsl_priv { - hash_table_t *glsl_program_lookup; + struct hash_table_t *glsl_program_lookup; struct glsl_shader_prog_link *glsl_program; GLhandleARB depth_blt_glsl_program_id; }; @@ -269,7 +269,7 @@ struct shader_arb_priv { GLuint depth_blt_vprogram_id; GLuint depth_blt_fprogram_id; BOOL use_arbfp_fixed_func; - hash_table_t *fragment_shaders; + struct hash_table_t *fragment_shaders; }; /* X11 locking */ @@ -559,6 +559,7 @@ struct fragment_pipeline { void (*free_private)(IWineD3DDevice *iface); BOOL (*conv_supported)(WINED3DFORMAT conv); const struct StateEntryTemplate *states; + BOOL ffp_proj_control; }; extern const struct StateEntryTemplate misc_state_template[]; @@ -794,8 +795,8 @@ struct ffp_desc }; void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *settings, BOOL ignore_textype); -struct ffp_desc *find_ffp_shader(hash_table_t *fragment_shaders, struct ffp_settings *settings); -void add_ffp_shader(hash_table_t *shaders, struct ffp_desc *desc); +struct ffp_desc *find_ffp_shader(struct hash_table_t *fragment_shaders, struct ffp_settings *settings); +void add_ffp_shader(struct hash_table_t *shaders, struct ffp_desc *desc); BOOL ffp_program_key_compare(void *keya, void *keyb); unsigned int ffp_program_key_hash(void *key); @@ -859,7 +860,7 @@ struct IWineD3DDeviceImpl const struct fragment_pipeline *frag_pipe; const struct blit_shader *blitter; - unsigned int max_ffp_textures; + unsigned int max_ffp_textures, max_ffp_texture_stages; /* To store */ BOOL view_ident; /* true iff view matrix is identity */ @@ -1816,7 +1817,7 @@ GLenum StencilOp(DWORD op); GLenum CompareFunc(DWORD func); BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3); void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst); -void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype); +void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype, BOOL ffp_can_disable_proj); void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context); void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context); void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context); @@ -1885,7 +1886,6 @@ unsigned int count_bits(unsigned int mask); extern BYTE* WINAPI IWineD3DVertexBufferImpl_GetMemory(IWineD3DVertexBuffer* iface, DWORD iOffset, GLint *vbo); extern HRESULT WINAPI IWineD3DVertexBufferImpl_ReleaseMemory(IWineD3DVertexBuffer* iface); extern HRESULT WINAPI IWineD3DBaseTextureImpl_BindTexture(IWineD3DBaseTexture *iface); - extern HRESULT WINAPI IWineD3DBaseTextureImpl_UnBindTexture(IWineD3DBaseTexture *iface); extern void WINAPI IWineD3DBaseTextureImpl_ApplyStateChanges(IWineD3DBaseTexture *iface, const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]); /*** class static members ***/ void IWineD3DBaseTextureImpl_CleanUp(IWineD3DBaseTexture *iface); diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index 8bbc252fe4f..dcde11bae45 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -896,7 +896,7 @@ static int BITBLT_GetSrcAreaStretch( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE XPutImage( gdi_display, pixmap, gc, imageDst, 0, 0, 0, 0, rectDst.right - rectDst.left, rectDst.bottom - rectDst.top ); XDestroyImage( imageSrc ); - XDestroyImage( imageDst ); + X11DRV_DIB_DestroyXImage( imageDst ); wine_tsx11_unlock(); return 0; /* no exposure events generated */ } @@ -1026,7 +1026,7 @@ static int BITBLT_GetSrcArea( X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDe XPutImage( gdi_display, pixmap, gc, imageDst, 0, 0, 0, 0, width, height ); XDestroyImage( imageSrc ); - XDestroyImage( imageDst ); + X11DRV_DIB_DestroyXImage( imageDst ); wine_tsx11_unlock(); } } diff --git a/dlls/winex11.drv/bitmap.c b/dlls/winex11.drv/bitmap.c index 0bcb0871da3..32018c84770 100644 --- a/dlls/winex11.drv/bitmap.c +++ b/dlls/winex11.drv/bitmap.c @@ -316,7 +316,7 @@ LONG X11DRV_SetBitmapBits( HBITMAP hbitmap, const void *bits, LONG count ) wine_tsx11_lock(); image = XCreateImage( gdi_display, visual, physBitmap->pixmap_depth, ZPixmap, 0, NULL, bitmap.bmWidth, height, 32, 0 ); - if (!(image->data = malloc(image->bytes_per_line * height))) + if (!(image->data = HeapAlloc( GetProcessHeap(), 0, image->bytes_per_line * height ))) { WARN("No memory to create image data.\n"); XDestroyImage( image ); @@ -407,7 +407,9 @@ LONG X11DRV_SetBitmapBits( HBITMAP hbitmap, const void *bits, LONG count ) } XPutImage( gdi_display, physBitmap->pixmap, BITMAP_GC(physBitmap), image, 0, 0, 0, 0, bitmap.bmWidth, height ); - XDestroyImage( image ); /* frees image->data too */ + HeapFree( GetProcessHeap(), 0, image->data ); + image->data = NULL; + XDestroyImage( image ); wine_tsx11_unlock(); return count; } diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c index b2a5b5ab071..461da16c414 100644 --- a/dlls/winex11.drv/dib.c +++ b/dlls/winex11.drv/dib.c @@ -221,19 +221,36 @@ int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) XImage *X11DRV_DIB_CreateXImage( int width, int height, int depth ) { int width_bytes; - XImage *image; + XImage *image = NULL; + void *data; wine_tsx11_lock(); width_bytes = X11DRV_DIB_GetXImageWidthBytes( width, depth ); - image = XCreateImage( gdi_display, visual, depth, ZPixmap, 0, - calloc( height, width_bytes ), - width, height, 32, width_bytes ); + data = HeapAlloc( GetProcessHeap(), 0, height * width_bytes ); + if (data) image = XCreateImage( gdi_display, visual, depth, ZPixmap, 0, + data, width, height, 32, width_bytes ); + if (!image) HeapFree( GetProcessHeap(), 0, data ); wine_tsx11_unlock(); return image; } /*********************************************************************** + * X11DRV_DIB_DestroyXImage + * + * Destroy an X image created with X11DRV_DIB_CreateXImage. + */ +void X11DRV_DIB_DestroyXImage( XImage *image ) +{ + HeapFree( GetProcessHeap(), 0, image->data ); + image->data = NULL; + wine_tsx11_lock(); + XDestroyImage( image ); + wine_tsx11_unlock(); +} + + +/*********************************************************************** * DIB_GetBitmapInfoEx * * Get the info from a bitmap header. @@ -3520,7 +3537,7 @@ static int X11DRV_DIB_SetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr ) else { bmpImage = XCreateImage( gdi_display, visual, descr->depth, ZPixmap, 0, NULL, descr->infoWidth, lines, 32, 0 ); - bmpImage->data = calloc( lines, bmpImage->bytes_per_line ); + bmpImage->data = HeapAlloc( GetProcessHeap(), 0, lines * bmpImage->bytes_per_line ); if(bmpImage->data == NULL) { ERR("Out of memory!\n"); XDestroyImage( bmpImage ); @@ -3628,7 +3645,7 @@ static int X11DRV_DIB_SetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr ) descr->xSrc, descr->ySrc, descr->xDest, descr->yDest, descr->width, descr->height ); } - if (!descr->image) XDestroyImage( bmpImage ); + if (!descr->image) X11DRV_DIB_DestroyXImage( bmpImage ); wine_tsx11_unlock(); return lines; } @@ -3649,7 +3666,7 @@ static int X11DRV_DIB_GetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr ) else { bmpImage = XCreateImage( gdi_display, visual, descr->depth, ZPixmap, 0, NULL, descr->infoWidth, lines, 32, 0 ); - bmpImage->data = calloc( lines, bmpImage->bytes_per_line ); + bmpImage->data = HeapAlloc( GetProcessHeap(), 0, lines * bmpImage->bytes_per_line ); if(bmpImage->data == NULL) { ERR("Out of memory!\n"); XDestroyImage( bmpImage ); @@ -3766,12 +3783,7 @@ static int X11DRV_DIB_GetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr ) break; } - if (!descr->image) - { - wine_tsx11_lock(); - XDestroyImage( bmpImage ); - wine_tsx11_unlock(); - } + if (!descr->image) X11DRV_DIB_DestroyXImage( bmpImage ); return lines; } @@ -4751,7 +4763,7 @@ void X11DRV_DIB_DeleteDIBSection(X_PHYSBITMAP *physBitmap, DIBSECTION *dib) } else #endif - XDestroyImage( physBitmap->image ); + X11DRV_DIB_DestroyXImage( physBitmap->image ); wine_tsx11_unlock(); } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 8c1ca0de193..d3dc16b0e6c 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1210,7 +1210,7 @@ static void sync_window_position( Display *display, struct x11drv_win_data *data mask |= CWX | CWY; } - if (!(swp_flags & SWP_NOZORDER)) + if (!(swp_flags & SWP_NOZORDER) || (swp_flags & SWP_SHOWWINDOW)) { /* find window that this one must be after */ HWND prev = GetWindow( data->hwnd, GW_HWNDPREV ); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 6d8ad899e05..a170dcf47ae 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -237,6 +237,7 @@ extern void X11DRV_FONT_Init( int log_pixels_x, int log_pixels_y ); extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ); extern XImage *X11DRV_DIB_CreateXImage( int width, int height, int depth ); +extern void X11DRV_DIB_DestroyXImage( XImage *image ); extern HGLOBAL X11DRV_DIB_CreateDIBFromBitmap(HDC hdc, HBITMAP hBmp); extern HGLOBAL X11DRV_DIB_CreateDIBFromPixmap(Pixmap pixmap, HDC hdc); extern Pixmap X11DRV_DIB_CreatePixmapFromDIB( HGLOBAL hPackedDIB, HDC hdc ); diff --git a/dlls/winex11.drv/xinerama.c b/dlls/winex11.drv/xinerama.c index ee735e61172..f68cf2aa8d6 100644 --- a/dlls/winex11.drv/xinerama.c +++ b/dlls/winex11.drv/xinerama.c @@ -218,7 +218,8 @@ BOOL X11DRV_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPA RECT monrect = monitors[i].rcMonitor; OffsetRect( &monrect, -origin.x, -origin.y ); if (IntersectRect( &monrect, &monrect, &limit )) - if (!proc( index_to_monitor(i), hdc, &monrect, lp )) break; + if (!proc( index_to_monitor(i), hdc, &monrect, lp )) + return FALSE; } } else @@ -227,7 +228,8 @@ BOOL X11DRV_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPA { RECT unused; if (!rect || IntersectRect( &unused, &monitors[i].rcMonitor, rect )) - if (!proc( index_to_monitor(i), 0, &monitors[i].rcMonitor, lp )) break; + if (!proc( index_to_monitor(i), 0, &monitors[i].rcMonitor, lp )) + return FALSE; } } return TRUE; diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c index a788b018a05..d367723355b 100644 --- a/dlls/winhttp/net.c +++ b/dlls/winhttp/net.c @@ -18,7 +18,6 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" #include #include @@ -31,9 +30,20 @@ #ifdef HAVE_SYS_IOCTL_H # include #endif +#ifdef HAVE_SYS_FILIO_H +# include +#endif #ifdef HAVE_POLL_H # include #endif +#ifdef HAVE_OPENSSL_SSL_H +# include +#undef FAR +#undef DSA +#endif + +#include "wine/debug.h" +#include "wine/library.h" #include "windef.h" #include "winbase.h" @@ -64,6 +74,42 @@ static CRITICAL_SECTION cs_gethostbyname = { &critsect_debug, -1, 0, 0, 0, 0 }; #endif +#ifdef SONAME_LIBSSL + +#include + +static void *libssl_handle; +static void *libcrypto_handle; + +static SSL_METHOD *method; + +#define MAKE_FUNCPTR(f) static typeof(f) * p##f + +MAKE_FUNCPTR( SSL_library_init ); +MAKE_FUNCPTR( SSL_load_error_strings ); +MAKE_FUNCPTR( SSLv23_method ); +MAKE_FUNCPTR( SSL_CTX_new ); +MAKE_FUNCPTR( SSL_CTX_free ); +MAKE_FUNCPTR( SSL_new ); +MAKE_FUNCPTR( SSL_free ); +MAKE_FUNCPTR( SSL_set_fd ); +MAKE_FUNCPTR( SSL_connect ); +MAKE_FUNCPTR( SSL_shutdown ); +MAKE_FUNCPTR( SSL_write ); +MAKE_FUNCPTR( SSL_read ); +MAKE_FUNCPTR( SSL_get_verify_result ); +MAKE_FUNCPTR( SSL_get_peer_certificate ); +MAKE_FUNCPTR( SSL_CTX_get_timeout ); +MAKE_FUNCPTR( SSL_CTX_set_timeout ); +MAKE_FUNCPTR( SSL_CTX_set_default_verify_paths ); + +MAKE_FUNCPTR( BIO_new_fp ); +MAKE_FUNCPTR( ERR_get_error ); +MAKE_FUNCPTR( ERR_error_string ); +#undef MAKE_FUNCPTR + +#endif + /* translate a unix error code into a winsock error code */ static int sock_get_error( int err ) { @@ -129,9 +175,75 @@ static int sock_get_error( int err ) return err; } -BOOL netconn_init( netconn_t *conn ) +BOOL netconn_init( netconn_t *conn, BOOL secure ) { conn->socket = -1; + if (!secure) return TRUE; + +#if defined(SONAME_LIBSSL) && defined(SONAME_LIBCRYPTO) + if (libssl_handle) return TRUE; + if (!(libssl_handle = wine_dlopen( SONAME_LIBSSL, RTLD_NOW, NULL, 0 ))) + { + ERR("Trying to use SSL but couldn't load %s. Expect trouble.\n", SONAME_LIBSSL); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + return FALSE; + } + if (!(libcrypto_handle = wine_dlopen( SONAME_LIBCRYPTO, RTLD_NOW, NULL, 0 ))) + { + ERR("Trying to use SSL but couldn't load %s. Expect trouble.\n", SONAME_LIBCRYPTO); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + return FALSE; + } +#define LOAD_FUNCPTR(x) \ + if (!(p##x = wine_dlsym( libssl_handle, #x, NULL, 0 ))) \ + { \ + ERR("Failed to load symbol %s\n", #x); \ + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); \ + return FALSE; \ + } + LOAD_FUNCPTR( SSL_library_init ); + LOAD_FUNCPTR( SSL_load_error_strings ); + LOAD_FUNCPTR( SSLv23_method ); + LOAD_FUNCPTR( SSL_CTX_new ); + LOAD_FUNCPTR( SSL_CTX_free ); + LOAD_FUNCPTR( SSL_new ); + LOAD_FUNCPTR( SSL_free ); + LOAD_FUNCPTR( SSL_set_fd ); + LOAD_FUNCPTR( SSL_connect ); + LOAD_FUNCPTR( SSL_shutdown ); + LOAD_FUNCPTR( SSL_write ); + LOAD_FUNCPTR( SSL_read ); + LOAD_FUNCPTR( SSL_get_verify_result ); + LOAD_FUNCPTR( SSL_get_peer_certificate ); + LOAD_FUNCPTR( SSL_CTX_get_timeout ); + LOAD_FUNCPTR( SSL_CTX_set_timeout ); + LOAD_FUNCPTR( SSL_CTX_set_default_verify_paths ); +#undef LOAD_FUNCPTR + +#define LOAD_FUNCPTR(x) \ + if (!(p##x = wine_dlsym( libcrypto_handle, #x, NULL, 0 ))) \ + { \ + ERR("Failed to load symbol %s\n", #x); \ + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); \ + return FALSE; \ + } + LOAD_FUNCPTR( BIO_new_fp ); + LOAD_FUNCPTR( ERR_get_error ); + LOAD_FUNCPTR( ERR_error_string ); +#undef LOAD_FUNCPTR + + pSSL_library_init(); + pSSL_load_error_strings(); + pBIO_new_fp( stderr, BIO_NOCLOSE ); + + method = pSSLv23_method(); + conn->ssl_ctx = pSSL_CTX_new( method ); + +#else + WARN("SSL support not compiled in.\n"); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + return FALSE; +#endif return TRUE; } @@ -155,6 +267,23 @@ BOOL netconn_close( netconn_t *conn ) { int res; +#ifdef SONAME_LIBSSL + if (conn->secure) + { + heap_free( conn->peek_msg_mem ); + conn->peek_msg_mem = NULL; + conn->peek_msg = NULL; + conn->peek_len = 0; + + pSSL_shutdown( conn->ssl_conn ); + pSSL_free( conn->ssl_conn ); + pSSL_CTX_free( conn->ssl_ctx ); + + conn->ssl_conn = NULL; + conn->ssl_ctx = NULL; + conn->secure = FALSE; + } +#endif res = close( conn->socket ); conn->socket = -1; if (res == -1) @@ -176,9 +305,76 @@ BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned return TRUE; } +BOOL netconn_secure_connect( netconn_t *conn ) +{ +#ifdef SONAME_LIBSSL + X509 *cert; + long res; + + if (!pSSL_CTX_set_default_verify_paths( conn->ssl_ctx )) + { + ERR("SSL_CTX_set_default_verify_paths failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + return FALSE; + } + if (!(conn->ssl_conn = pSSL_new( conn->ssl_ctx ))) + { + ERR("SSL_new failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + goto fail; + } + if (!pSSL_set_fd( conn->ssl_conn, conn->socket )) + { + ERR("SSL_set_fd failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + goto fail; + } + if (pSSL_connect( conn->ssl_conn ) <= 0) + { + ERR("SSL_connect failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + goto fail; + } + if (!(cert = pSSL_get_peer_certificate( conn->ssl_conn ))) + { + ERR("No certificate for server: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + goto fail; + } + if ((res = pSSL_get_verify_result( conn->ssl_conn )) != X509_V_OK) + { + /* FIXME: we should set an error and return, but we only print an error at the moment */ + ERR("couldn't verify server certificate (%ld)\n", res); + } + TRACE("established SSL connection\n"); + conn->secure = TRUE; + return TRUE; + +fail: + if (conn->ssl_conn) + { + pSSL_shutdown( conn->ssl_conn ); + pSSL_free( conn->ssl_conn ); + conn->ssl_conn = NULL; + } +#endif + return FALSE; +} + BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int *sent ) { if (!netconn_connected( conn )) return FALSE; + if (conn->secure) + { +#ifdef SONAME_LIBSSL + if (flags) FIXME("SSL_write doesn't support any flags (%08x)\n", flags); + *sent = pSSL_write( conn->ssl_conn, msg, len ); + if (*sent < 1 && len) return FALSE; + return TRUE; +#else + return FALSE; +#endif + } if ((*sent = send( conn->socket, msg, len, flags )) == -1) { set_last_error( sock_get_error( errno ) ); @@ -192,6 +388,59 @@ BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd *recvd = 0; if (!netconn_connected( conn )) return FALSE; if (!len) return TRUE; + + if (conn->secure) + { +#ifdef SONAME_LIBSSL + if (flags & ~(MSG_PEEK | MSG_WAITALL)) + FIXME("SSL_read does not support the following flags: %08x\n", flags); + + /* this ugly hack is all for MSG_PEEK */ + if (flags & MSG_PEEK && !conn->peek_msg) + { + if (!(conn->peek_msg = conn->peek_msg_mem = heap_alloc( len + 1 ))) return FALSE; + } + else if (flags & MSG_PEEK && conn->peek_msg) + { + if (len < conn->peek_len) FIXME("buffer isn't big enough, should we wrap?\n"); + *recvd = min( len, conn->peek_len ); + memcpy( buf, conn->peek_msg, *recvd ); + return TRUE; + } + else if (conn->peek_msg) + { + *recvd = min( len, conn->peek_len ); + memcpy( buf, conn->peek_msg, *recvd ); + conn->peek_len -= *recvd; + conn->peek_msg += *recvd; + + if (conn->peek_len == 0) + { + heap_free( conn->peek_msg_mem ); + conn->peek_msg_mem = NULL; + conn->peek_msg = NULL; + } + /* check if we have enough data from the peek buffer */ + if (!(flags & MSG_WAITALL) || (*recvd == len)) return TRUE; + } + *recvd += pSSL_read( conn->ssl_conn, (char *)buf + *recvd, len - *recvd ); + if (flags & MSG_PEEK) /* must copy into buffer */ + { + conn->peek_len = *recvd; + if (!*recvd) + { + heap_free( conn->peek_msg_mem ); + conn->peek_msg_mem = NULL; + conn->peek_msg = NULL; + } + else memcpy( conn->peek_msg, buf, *recvd ); + } + if (*recvd < 1 && len) return FALSE; + return TRUE; +#else + return FALSE; +#endif + } if ((*recvd = recv( conn->socket, buf, len, flags )) == -1) { set_last_error( sock_get_error( errno ) ); @@ -207,6 +456,14 @@ BOOL netconn_query_data_available( netconn_t *conn, DWORD *available ) #endif *available = 0; if (!netconn_connected( conn )) return FALSE; + + if (conn->secure) + { +#ifdef SONAME_LIBSSL + if (conn->peek_msg) *available = conn->peek_len; +#endif + return TRUE; + } #ifdef FIONREAD if (!(ret = ioctl( conn->socket, FIONREAD, &unread ))) { @@ -225,6 +482,42 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) if (!netconn_connected( conn )) return FALSE; + if (conn->secure) + { +#ifdef SONAME_LIBSSL + long timeout; + + timeout = pSSL_CTX_get_timeout( conn->ssl_ctx ); + pSSL_CTX_set_timeout( conn->ssl_ctx, DEFAULT_RECEIVE_TIMEOUT ); + + while (recvd < *buflen) + { + int dummy; + if (!netconn_recv( conn, &buffer[recvd], 1, 0, &dummy )) + { + set_last_error( ERROR_CONNECTION_ABORTED ); + break; + } + if (buffer[recvd] == '\n') + { + ret = TRUE; + break; + } + if (buffer[recvd] != '\r') recvd++; + } + pSSL_CTX_set_timeout( conn->ssl_ctx, timeout ); + if (ret) + { + buffer[recvd++] = 0; + *buflen = recvd; + TRACE("received line %s\n", debugstr_a(buffer)); + } + return ret; +#else + return FALSE; +#endif + } + pfd.fd = conn->socket; pfd.events = POLLIN; while (recvd < *buflen) @@ -254,9 +547,8 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) buffer[recvd++] = 0; *buflen = recvd; TRACE("received line %s\n", debugstr_a(buffer)); - return TRUE; } - return FALSE; + return ret; } DWORD netconn_set_timeout( netconn_t *netconn, BOOL send, int value ) diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index ef1582d1839..b0b81f0dc9d 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -24,6 +24,9 @@ #ifdef HAVE_ARPA_INET_H # include #endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif #include "windef.h" #include "winbase.h" @@ -538,6 +541,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID else headers = request->raw_headers; + if (!headers) return FALSE; len = strlenW( headers ) * sizeof(WCHAR); if (len + sizeof(WCHAR) > *buflen) { @@ -683,6 +687,12 @@ static BOOL open_connection( request_t *request ) heap_free( addressW ); return FALSE; } + if (request->hdr.flags & WINHTTP_FLAG_SECURE && !netconn_secure_connect( &request->netconn )) + { + netconn_close( &request->netconn ); + heap_free( addressW ); + return FALSE; + } send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, addressW, 0 ); @@ -1136,3 +1146,232 @@ BOOL WINAPI WinHttpWriteData( HINTERNET hrequest, LPCVOID buffer, DWORD to_write release_object( &request->hdr ); return ret; } + +#define ARRAYSIZE(array) (sizeof(array) / sizeof((array)[0])) + +static DWORD auth_scheme_from_header( WCHAR *header ) +{ + static const WCHAR basic[] = {'B','a','s','i','c'}; + static const WCHAR ntlm[] = {'N','T','L','M'}; + static const WCHAR passport[] = {'P','a','s','s','p','o','r','t'}; + static const WCHAR digest[] = {'D','i','g','e','s','t'}; + static const WCHAR negotiate[] = {'N','e','g','o','t','i','a','t','e'}; + + if (!strncmpiW( header, basic, ARRAYSIZE(basic) ) && + (header[ARRAYSIZE(basic)] == ' ' || !header[ARRAYSIZE(basic)])) return WINHTTP_AUTH_SCHEME_BASIC; + + if (!strncmpiW( header, ntlm, ARRAYSIZE(ntlm) ) && + (header[ARRAYSIZE(ntlm)] == ' ' || !header[ARRAYSIZE(ntlm)])) return WINHTTP_AUTH_SCHEME_NTLM; + + if (!strncmpiW( header, passport, ARRAYSIZE(passport) ) && + (header[ARRAYSIZE(passport)] == ' ' || !header[ARRAYSIZE(passport)])) return WINHTTP_AUTH_SCHEME_PASSPORT; + + if (!strncmpiW( header, digest, ARRAYSIZE(digest) ) && + (header[ARRAYSIZE(digest)] == ' ' || !header[ARRAYSIZE(digest)])) return WINHTTP_AUTH_SCHEME_DIGEST; + + if (!strncmpiW( header, negotiate, ARRAYSIZE(negotiate) ) && + (header[ARRAYSIZE(negotiate)] == ' ' || !header[ARRAYSIZE(negotiate)])) return WINHTTP_AUTH_SCHEME_NEGOTIATE; + + return 0; +} + +static BOOL query_auth_schemes( request_t *request, DWORD level, LPDWORD supported, LPDWORD first ) +{ + DWORD index = 0; + BOOL ret = FALSE; + + for (;;) + { + WCHAR *buffer; + DWORD size, scheme; + + size = 0; + query_headers( request, level, NULL, NULL, &size, &index ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) break; + + index--; + if (!(buffer = heap_alloc( size ))) return FALSE; + if (!query_headers( request, level, NULL, buffer, &size, &index )) + { + heap_free( buffer ); + return FALSE; + } + scheme = auth_scheme_from_header( buffer ); + if (index == 1) *first = scheme; + *supported |= scheme; + + heap_free( buffer ); + ret = TRUE; + } + return ret; +} + +/*********************************************************************** + * WinHttpQueryAuthSchemes (winhttp.@) + */ +BOOL WINAPI WinHttpQueryAuthSchemes( HINTERNET hrequest, LPDWORD supported, LPDWORD first, LPDWORD target ) +{ + BOOL ret = FALSE; + request_t *request; + + TRACE("%p, %p, %p, %p\n", hrequest, supported, first, target); + + if (!(request = (request_t *)grab_object( hrequest ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) + { + release_object( &request->hdr ); + set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); + return FALSE; + } + + if (query_auth_schemes( request, WINHTTP_QUERY_WWW_AUTHENTICATE, supported, first )) + { + *target = WINHTTP_AUTH_TARGET_SERVER; + ret = TRUE; + } + else if (query_auth_schemes( request, WINHTTP_QUERY_PROXY_AUTHENTICATE, supported, first )) + { + *target = WINHTTP_AUTH_TARGET_PROXY; + ret = TRUE; + } + + release_object( &request->hdr ); + return ret; +} + +static UINT encode_base64( const char *bin, unsigned int len, WCHAR *base64 ) +{ + UINT n = 0, x; + static const char base64enc[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + while (len > 0) + { + /* first 6 bits, all from bin[0] */ + base64[n++] = base64enc[(bin[0] & 0xfc) >> 2]; + x = (bin[0] & 3) << 4; + + /* next 6 bits, 2 from bin[0] and 4 from bin[1] */ + if (len == 1) + { + base64[n++] = base64enc[x]; + base64[n++] = '='; + base64[n++] = '='; + break; + } + base64[n++] = base64enc[x | ((bin[1] & 0xf0) >> 4)]; + x = (bin[1] & 0x0f) << 2; + + /* next 6 bits 4 from bin[1] and 2 from bin[2] */ + if (len == 2) + { + base64[n++] = base64enc[x]; + base64[n++] = '='; + break; + } + base64[n++] = base64enc[x | ((bin[2] & 0xc0) >> 6)]; + + /* last 6 bits, all from bin [2] */ + base64[n++] = base64enc[bin[2] & 0x3f]; + bin += 3; + len -= 3; + } + base64[n] = 0; + return n; +} + +static BOOL set_credentials( request_t *request, DWORD target, DWORD scheme, LPCWSTR username, LPCWSTR password ) +{ + static const WCHAR basic[] = {'B','a','s','i','c',' ',0}; + + const WCHAR *auth_scheme, *auth_target; + WCHAR *auth_header; + DWORD len, auth_data_len; + char *auth_data; + BOOL ret; + + switch (target) + { + case WINHTTP_AUTH_TARGET_SERVER: auth_target = attr_authorization; break; + case WINHTTP_AUTH_TARGET_PROXY: auth_target = attr_proxy_authorization; break; + default: + WARN("unknown target %x\n", target); + return FALSE; + } + switch (scheme) + { + case WINHTTP_AUTH_SCHEME_BASIC: + { + int userlen = WideCharToMultiByte( CP_UTF8, 0, username, strlenW( username ), NULL, 0, NULL, NULL ); + int passlen = WideCharToMultiByte( CP_UTF8, 0, password, strlenW( password ), NULL, 0, NULL, NULL ); + + TRACE("basic authentication\n"); + + auth_scheme = basic; + auth_data_len = userlen + 1 + passlen; + if (!(auth_data = heap_alloc( auth_data_len ))) return FALSE; + + WideCharToMultiByte( CP_UTF8, 0, username, -1, auth_data, userlen, NULL, NULL ); + auth_data[userlen] = ':'; + WideCharToMultiByte( CP_UTF8, 0, password, -1, auth_data + userlen + 1, passlen, NULL, NULL ); + break; + } + case WINHTTP_AUTH_SCHEME_NTLM: + case WINHTTP_AUTH_SCHEME_PASSPORT: + case WINHTTP_AUTH_SCHEME_DIGEST: + case WINHTTP_AUTH_SCHEME_NEGOTIATE: + FIXME("unimplemented authentication scheme %x\n", scheme); + return FALSE; + default: + WARN("unknown authentication scheme %x\n", scheme); + return FALSE; + } + + len = strlenW( auth_scheme ) + ((auth_data_len + 2) * 4) / 3; + if (!(auth_header = heap_alloc( (len + 1) * sizeof(WCHAR) ))) + { + heap_free( auth_data ); + return FALSE; + } + strcpyW( auth_header, auth_scheme ); + encode_base64( auth_data, auth_data_len, auth_header + strlenW( auth_header ) ); + + ret = process_header( request, auth_target, auth_header, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE, TRUE ); + + heap_free( auth_data ); + heap_free( auth_header ); + return ret; +} + +/*********************************************************************** + * WinHttpSetCredentials (winhttp.@) + */ +BOOL WINAPI WinHttpSetCredentials( HINTERNET hrequest, DWORD target, DWORD scheme, LPCWSTR username, + LPCWSTR password, LPVOID params ) +{ + BOOL ret; + request_t *request; + + TRACE("%p, %x, 0x%08x, %s, %p, %p\n", hrequest, target, scheme, debugstr_w(username), password, params); + + if (!(request = (request_t *)grab_object( hrequest ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) + { + release_object( &request->hdr ); + set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); + return FALSE; + } + + ret = set_credentials( request, target, scheme, username, password ); + + release_object( &request->hdr ); + return ret; +} diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 169b98e1b52..9b66dccaef3 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -270,11 +270,11 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o request->connect = connect; list_add_head( &connect->hdr.children, &request->hdr.entry ); - if (!netconn_init( &request->netconn )) goto end; + if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end; - if (!verb) verb = get; - if (!object) object = slash; - if (!version) version = http1_1; + if (!verb || !*verb) verb = get; + if (!object || !*object) object = slash; + if (!version || !*version) version = http1_1; if (!(request->verb = strdupW( verb ))) goto end; if (!(request->path = strdupW( object ))) goto end; diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 3fbb24c5263..6ba3a32a7fd 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -525,6 +525,93 @@ static void test_WinHttpAddHeaders(void) } +static void test_secure_connection(void) +{ + static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0}; + + HANDLE ses, con, req; + DWORD size; + BOOL ret; + + ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + con = WinHttpConnect(ses, google, 443, 0); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + /* try without setting WINHTTP_FLAG_SECURE */ + req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); + ok(ret, "failed to send request %u\n", GetLastError()); + + ret = WinHttpReceiveResponse(req, NULL); + ok(!ret, "succeeded unexpectedly\n"); + + size = 0; + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL); + ok(!ret, "succeeded unexpectedly\n"); + + WinHttpCloseHandle(req); + + req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, WINHTTP_FLAG_SECURE); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); + ok(ret, "failed to send request %u\n", GetLastError()); + + ret = WinHttpReceiveResponse(req, NULL); + ok(ret, "failed to receive response %u\n", GetLastError()); + + size = 0; + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL); + ok(!ret, "succeeded unexpectedly\n"); + + WinHttpCloseHandle(req); + WinHttpCloseHandle(con); + WinHttpCloseHandle(ses); +} + +static void test_request_parameter_defaults(void) +{ + static const WCHAR empty[] = {0}; + static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; + + HANDLE ses, con, req; + BOOL ret; + + ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + con = WinHttpConnect(ses, codeweavers, 0, 0); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); + ok(ret, "failed to send request %u\n", GetLastError()); + + ret = WinHttpReceiveResponse(req, NULL); + ok(ret, "failed to receive response %u\n", GetLastError()); + + WinHttpCloseHandle(req); + + req = WinHttpOpenRequest(con, empty, empty, empty, NULL, NULL, 0); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); + ok(ret, "failed to send request %u\n", GetLastError()); + + ret = WinHttpReceiveResponse(req, NULL); + ok(ret, "failed to receive response %u\n", GetLastError()); + + WinHttpCloseHandle(req); + WinHttpCloseHandle(con); + WinHttpCloseHandle(ses); +} + START_TEST (winhttp) { test_OpenRequest(); @@ -532,4 +619,6 @@ START_TEST (winhttp) test_WinHttpTimeFromSystemTime(); test_WinHttpTimeToSystemTime(); test_WinHttpAddHeaders(); + test_secure_connection(); + test_request_parameter_defaults(); } diff --git a/dlls/winhttp/winhttp.spec b/dlls/winhttp/winhttp.spec index 41443649d24..15c560a65a3 100644 --- a/dlls/winhttp/winhttp.spec +++ b/dlls/winhttp/winhttp.spec @@ -14,14 +14,14 @@ @ stdcall WinHttpGetProxyForUrl(ptr wstr ptr ptr) @ stdcall WinHttpOpen(wstr long wstr wstr long) @ stdcall WinHttpOpenRequest(ptr wstr wstr wstr wstr ptr long) -@ stub WinHttpQueryAuthSchemes +@ stdcall WinHttpQueryAuthSchemes(ptr ptr ptr ptr) @ stdcall WinHttpQueryDataAvailable(ptr ptr) @ stdcall WinHttpQueryHeaders(ptr long wstr ptr ptr ptr) @ stdcall WinHttpQueryOption(ptr long ptr ptr) @ stdcall WinHttpReadData(ptr ptr long ptr) @ stdcall WinHttpReceiveResponse(ptr ptr) @ stdcall WinHttpSendRequest(ptr wstr long ptr long long ptr) -@ stub WinHttpSetCredentials +@ stdcall WinHttpSetCredentials(ptr long long wstr ptr ptr) @ stdcall WinHttpSetDefaultProxyConfiguration(ptr) @ stdcall WinHttpSetOption(ptr long ptr long) @ stdcall WinHttpSetStatusCallback(ptr ptr long ptr) diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h index 86868aff168..6bd6949da47 100644 --- a/dlls/winhttp/winhttp_private.h +++ b/dlls/winhttp/winhttp_private.h @@ -87,6 +87,9 @@ typedef struct typedef struct { int socket; + BOOL secure; /* SSL active on connection? */ + void *ssl_ctx; + void *ssl_conn; char *peek_msg; char *peek_msg_mem; size_t peek_len; @@ -130,10 +133,11 @@ BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int ); BOOL netconn_connected( netconn_t * ); BOOL netconn_create( netconn_t *, int, int, int ); BOOL netconn_get_next_line( netconn_t *, char *, DWORD * ); -BOOL netconn_init( netconn_t * ); +BOOL netconn_init( netconn_t *, BOOL ); BOOL netconn_query_data_available( netconn_t *, DWORD * ); BOOL netconn_recv( netconn_t *, void *, size_t, int, int * ); BOOL netconn_resolve( WCHAR *, INTERNET_PORT, struct sockaddr_in * ); +BOOL netconn_secure_connect( netconn_t * ); BOOL netconn_send( netconn_t *, const void *, size_t, int, int * ); static inline void *heap_alloc( SIZE_T size ) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 4630f3bac9d..00dfa0f4c6c 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -74,6 +74,7 @@ static const WCHAR szProxy_Authorization[] = { 'P','r','o','x','y','-','A','u',' static const WCHAR szStatus[] = { 'S','t','a','t','u','s',0 }; static const WCHAR szKeepAlive[] = {'K','e','e','p','-','A','l','i','v','e',0}; static const WCHAR szGET[] = { 'G','E','T', 0 }; +static const WCHAR szCrLf[] = {'\r','\n', 0}; #define MAXHOSTNAME 100 #define MAX_FIELD_VALUE_LEN 256 @@ -256,7 +257,6 @@ static LPWSTR HTTP_BuildHeaderRequestString( LPWININETHTTPREQW lpwhr, LPCWSTR ve LPWSTR p; static const WCHAR szSpace[] = { ' ',0 }; - static const WCHAR szcrlf[] = {'\r','\n', 0}; static const WCHAR szColon[] = { ':',' ',0 }; static const WCHAR sztwocrlf[] = {'\r','\n','\r','\n', 0}; @@ -277,7 +277,7 @@ static LPWSTR HTTP_BuildHeaderRequestString( LPWININETHTTPREQW lpwhr, LPCWSTR ve { if (lpwhr->pCustHeaders[i].wFlags & HDR_ISREQUEST) { - req[n++] = szcrlf; + req[n++] = szCrLf; req[n++] = lpwhr->pCustHeaders[i].lpszField; req[n++] = szColon; req[n++] = lpwhr->pCustHeaders[i].lpszValue; @@ -2187,7 +2187,7 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev case HTTP_QUERY_RAW_HEADERS_CRLF: { LPWSTR headers; - DWORD len; + DWORD len = 0; BOOL ret = FALSE; if (request_only) @@ -2195,7 +2195,9 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev else headers = lpwhr->lpszRawHeaders; - len = strlenW(headers) * sizeof(WCHAR); + if (headers) + len = strlenW(headers) * sizeof(WCHAR); + if (len + sizeof(WCHAR) > *lpdwBufferLength) { len += sizeof(WCHAR); @@ -2204,7 +2206,13 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev } else if (lpBuffer) { - memcpy(lpBuffer, headers, len + sizeof(WCHAR)); + if (headers) + memcpy(lpBuffer, headers, len + sizeof(WCHAR)); + else + { + len = strlenW(szCrLf) * sizeof(WCHAR); + memcpy(lpBuffer, szCrLf, sizeof(szCrLf)); + } TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len / sizeof(WCHAR))); ret = TRUE; } @@ -2216,7 +2224,6 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev } case HTTP_QUERY_RAW_HEADERS: { - static const WCHAR szCrLf[] = {'\r','\n',0}; LPWSTR * ppszRawHeaderLines = HTTP_Tokenize(lpwhr->lpszRawHeaders, szCrLf); DWORD i, size = 0; LPWSTR pszString = (WCHAR*)lpBuffer; @@ -3136,14 +3143,13 @@ static void HTTP_InsertCookies(LPWININETHTTPREQW lpwhr) { int cnt = 0; static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0}; - static const WCHAR szcrlf[] = {'\r','\n',0}; - size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szcrlf); + size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szCrLf); if ((lpszCookies = HeapAlloc(GetProcessHeap(), 0, size))) { cnt += sprintfW(lpszCookies, szCookie); InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize); - strcatW(lpszCookies, szcrlf); + strcatW(lpszCookies, szCrLf); HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_ADD); HeapFree(GetProcessHeap(), 0, lpszCookies); @@ -3713,7 +3719,6 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear) DWORD buflen = MAX_REPLY_LEN; BOOL bSuccess = FALSE; INT rc = 0; - static const WCHAR szCrLf[] = {'\r','\n',0}; static const WCHAR szHundred[] = {'1','0','0',0}; char bufferA[MAX_REPLY_LEN]; LPWSTR status_code, status_text; diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c index f55fbf22033..77f39bbf625 100644 --- a/dlls/wininet/netconnection.c +++ b/dlls/wininet/netconnection.c @@ -37,6 +37,9 @@ #ifdef HAVE_SYS_SOCKET_H # include #endif +#ifdef HAVE_SYS_FILIO_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif @@ -634,8 +637,8 @@ BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPD if (!connection->useSSL) { struct pollfd pfd; - BOOL bSuccess = FALSE; DWORD nRecv = 0; + int ret; pfd.fd = connection->socketFD; pfd.events = POLLIN; @@ -644,16 +647,18 @@ BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPD { if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) { - if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0) + if ((ret = recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0)) <= 0) { - INTERNET_SetLastError(sock_get_error(errno)); - goto lend; + if (ret == -1) INTERNET_SetLastError(sock_get_error(errno)); + break; } if (lpszBuffer[nRecv] == '\n') { - bSuccess = TRUE; - break; + lpszBuffer[nRecv++] = '\0'; + *dwBuffer = nRecv; + TRACE(":%u %s\n", nRecv, lpszBuffer); + return TRUE; } if (lpszBuffer[nRecv] != '\r') nRecv++; @@ -661,22 +666,9 @@ BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPD else { INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT); - goto lend; + break; } } - - lend: /* FIXME: don't use labels */ - if (bSuccess) - { - lpszBuffer[nRecv++] = '\0'; - *dwBuffer = nRecv; - TRACE(":%u %s\n", nRecv, lpszBuffer); - return TRUE; - } - else - { - return FALSE; - } } else { @@ -714,11 +706,9 @@ BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPD TRACE("_SSL:%u %s\n", nRecv, lpszBuffer); return TRUE; } - return FALSE; -#else - return FALSE; #endif } + return FALSE; } diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index 7cd4abe0b0d..1c52f270499 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -569,6 +569,8 @@ static void InternetReadFileExA_test(int flags) SET_OPTIONAL(INTERNET_STATUS_CLOSING_CONNECTION); SET_OPTIONAL(INTERNET_STATUS_CONNECTION_CLOSED); SET_EXPECT(INTERNET_STATUS_REDIRECT); + SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); if (flags & INTERNET_FLAG_ASYNC) SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); else @@ -1206,6 +1208,16 @@ static void HttpHeaders_test(void) /* end of W version tests */ + /* Without HTTP_QUERY_FLAG_REQUEST_HEADERS */ + index = 0; + len = sizeof(buffer); + memset(buffer, 'x', sizeof(buffer)); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF, + buffer,&len,&index) == TRUE,"Query failed\n"); + ok(len == 2, "Expected 2, got %d\n", len); + ok(strcmp(buffer, "\r\n") == 0, "Expected CRLF, got '%s'\n", buffer); + ok(index == 0, "Index was incremented\n"); + ok(HttpAddRequestHeaders(hRequest,"Warning:test2",-1,HTTP_ADDREQ_FLAG_ADD), "Failed to add duplicate header using HTTP_ADDREQ_FLAG_ADD\n"); diff --git a/include/cryptuiapi.h b/include/cryptuiapi.h index 1065d08a52d..3d027f5444e 100644 --- a/include/cryptuiapi.h +++ b/include/cryptuiapi.h @@ -43,6 +43,277 @@ PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateFromStore( HCERTSTORE hCertStore, HWND hwnd, LPCWSTR pwszTitle, LPCWSTR pwszDisplayString, DWORD dwDontUseColumn, DWORD dwFlags, LPVOID pvReserved); +/* Values for CRYPTUI_CERT_MGR_STRUCT's dwFlags */ +#define CRYPTUI_CERT_MGR_PUBLISHER_TAB 0x00000004 +#define CRYPTUI_CERT_MGR_TAB_MASK 0x0000000f +#define CRYPTUI_CERT_MGR_SINGLE_TAB_FLAG 0x00008000 + +typedef struct _CRYPTUI_CERT_MGR_STRUCT +{ + DWORD dwSize; + HWND hwndParent; + DWORD dwFlags; + LPCWSTR pwszTitle; + LPCSTR pszInitUsageOID; +} CRYPTUI_CERT_MGR_STRUCT, *PCRYPTUI_CERT_MGR_STRUCT; +typedef const struct _CRYPTUI_CERT_MGR_STRUCT *PCCRYPTUI_CERT_MGR_STRUCT; + +BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr); + +typedef BOOL (WINAPI *PFNCFILTERPROC)(PCCERT_CONTEXT pCertContext, + BOOL *pfInitialSelectedCert, void *pvCallbackData); + +typedef struct tagCRYPTUI_INITDIALOG_STRUCT +{ + LPARAM lParam; + PCCERT_CONTEXT pCertContext; +} CRYPTUI_INITDIALOG_STRUCT, *PCRYPTUI_INITDIALOG_STRUCT; + +typedef struct tagCRYPTUI_VIEWCERTIFICATE_STRUCTA +{ + DWORD dwSize; + HWND hwndParent; + DWORD dwFlags; + LPCSTR szTitle; + PCCERT_CONTEXT pCertContext; + LPCSTR *rgszPurposes; + DWORD cPurposes; + union { + CRYPT_PROVIDER_DATA const *pCryptProviderData; + HANDLE hWVTStateData; + } DUMMYUNIONNAME; + BOOL fpCryptProviderDataTrustedUsage; + DWORD idxSigner; + DWORD idxCert; + BOOL fCounterSigner; + DWORD idxCounterSigner; + DWORD cStores; + HCERTSTORE *rghStores; + DWORD cPropSheetPages; + LPCPROPSHEETPAGEA rgPropSheetPages; + DWORD nStartPage; +} CRYPTUI_VIEWCERTIFICATE_STRUCTA, *PCRYPTUI_VIEWCERTIFICATE_STRUCTA; +typedef const CRYPTUI_VIEWCERTIFICATE_STRUCTA *PCCRYPTUI_VIEWCERTIFICATE_STRUCTA; + +typedef struct tagCRYPTUI_VIEWCERTIFICATE_STRUCTW +{ + DWORD dwSize; + HWND hwndParent; + DWORD dwFlags; + LPCWSTR szTitle; + PCCERT_CONTEXT pCertContext; + LPCSTR *rgszPurposes; + DWORD cPurposes; + union { + CRYPT_PROVIDER_DATA const *pCryptProviderData; + HANDLE hWVTStateData; + } DUMMYUNIONNAME; + BOOL fpCryptProviderDataTrustedUsage; + DWORD idxSigner; + DWORD idxCert; + BOOL fCounterSigner; + DWORD idxCounterSigner; + DWORD cStores; + HCERTSTORE *rghStores; + DWORD cPropSheetPages; + LPCPROPSHEETPAGEW rgPropSheetPages; + DWORD nStartPage; +} CRYPTUI_VIEWCERTIFICATE_STRUCTW, *PCRYPTUI_VIEWCERTIFICATE_STRUCTW; +typedef const CRYPTUI_VIEWCERTIFICATE_STRUCTW *PCCRYPTUI_VIEWCERTIFICATE_STRUCTW; + +#define CRYPTUI_VIEWCERTIFICATE_STRUCT WINELIB_NAME_AW(CRYPTUI_VIEWCERTIFICATE_STRUCT) +#define PCCRYPTUI_VIEWCERTIFICATE_STRUCT WINELIB_NAME_AW(PCCRYPTUI_VIEWCERTIFICATE_STRUCT) + +BOOL WINAPI CryptUIDlgViewCertificateA( + PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged); +BOOL WINAPI CryptUIDlgViewCertificateW( + PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged); +#define CryptUIDlgViewCertificate WINELIB_NAME_AW(CryptUIDlgViewCertificate) + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO +{ + DWORD dwSize; + GUID *pGuidSubject; + DWORD cbBlob; + BYTE *pbBlob; + LPCWSTR pwszDisplayName; +} CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO * + PCCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO +{ + DWORD dwSize; + DWORD cCertStore; + HCERTSTORE *rghCertStore; + PFNCFILTERPROC pFilterCallback; + void *pvCallbackData; +} CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO * + PCCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO +{ + DWORD dwSize; + LPWSTR pwszPvkFileName; + LPWSTR pwszProvName; + DWORD dwProvType; +} CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO, + *PCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO * + PCCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO +{ + DWORD dwSize; + LPWSTR pwszSigningCertFileName; + DWORD dwPvkChoice; + union { + PCCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO pPvkFileInfo; + PCRYPT_KEY_PROV_INFO pPvkProvInfo; + } DUMMYUNIONNAME; +} CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO, + *PCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO * + PCCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO +{ + DWORD dwSize; + DWORD dwAttrFlags; + LPCWSTR pwszDescription; + LPCWSTR pwszMoreInfoLocation; + LPCSTR pszHashAlg; + LPCWSTR pwszSigningCertDisplayString; + HCERTSTORE hAdditionalCertStore; + PCRYPT_ATTRIBUTES psAuthenticated; + PCRYPT_ATTRIBUTES psUnauthenticated; +} CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO, + *PCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO * + PCCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_INFO +{ + DWORD dwSize; + DWORD dwSubjectChoice; + union { + LPCWSTR pwszFileName; + PCCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO pSignBlobInfo; + } DUMMYUNIONNAME1; + DWORD dwSigningCertChoice; + union { + PCCERT_CONTEXT pSigningCertContext; + PCCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO pSigningCertStore; + PCCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO pSigningCertPvkInfo; + } DUMMYUNIONNAME2; + LPCWSTR pwszTimestampURL; + DWORD dwAdditionalCertChoice; + PCCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO pSignExtInfo; +} CRYPTUI_WIZ_DIGITAL_SIGN_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_INFO; +typedef const CRYPTUI_WIZ_DIGITAL_SIGN_INFO *PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO; + +typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT +{ + DWORD dwSize; + DWORD cbBlob; + BYTE *pbBlob; +} CRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT, *PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT; + +/* Values for CryptUIWizDigitalSign's dwFlags */ +#define CRYPTUI_WIZ_NO_UI 0x00000001 +#define CRYPTUI_WIZ_DIGITAL_SIGN_EXCLUDE_PAGE_HASHES 0x00000002 +#define CRYPTUI_WIZ_DIGITAL_SIGN_INCLUDE_PAGE_HASHES 0x00000004 + +BOOL WINAPI CryptUIWizDigitalSign(DWORD dwFlags, HWND hwndParent, + LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO pDigitalSignInfo, + PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT *ppSignContext); + +BOOL WINAPI CryptUIWizFreeDigitalSignContext( + PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT pSignContext); + +/* Values for CRYPTUI_WIZ_EXPORT_INFO's dwSubjectChoice */ +#define CRYPTUI_WIZ_EXPORT_CERT_CONTEXT 1 +#define CRYPTUI_WIZ_EXPORT_CTL_CONTEXT 2 +#define CRYPTUI_WIZ_EXPORT_CRL_CONTEXT 3 +#define CRYPTUI_WIZ_EXPORT_CERT_STORE 4 +#define CRYPTUI_WIZ_EXPORT_CERT_STORE_CERTIFICATES_ONLY 5 +#define CRYPTUI_WIZ_EXPORT_FORMAT_CRL 6 +#define CRYPTUI_WIZ_EXPORT_FORMAT_CTL 7 + +typedef struct _CRYPTUI_WIZ_EXPORT_INFO +{ + DWORD dwSize; + LPCWSTR pwszExportFileName; + DWORD dwSubjectChoice; + union { + PCCERT_CONTEXT pCertContext; + PCCTL_CONTEXT pCTLContext; + PCCRL_CONTEXT pCRLContext; + } DUMMYUNIONNAME; + DWORD cStores; + HCERTSTORE *rghStores; +} CRYPTUI_WIZ_EXPORT_INFO, *PCRYPTUI_WIZ_EXPORT_INFO; +typedef const CRYPTUI_WIZ_EXPORT_INFO *PCCRYPTUI_WIZ_EXPORT_INFO; + +/* Values for CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO's dwExportFormat */ +#define CRYPTUI_WIZ_EXPORT_FORMAT_DER 1 +#define CRYPTUI_WIZ_EXPORT_FORMAT_PFX 2 +#define CRYPTUI_WIZ_EXPORT_FORMAT_PKCS7 3 +#define CRYPTUI_WIZ_EXPORT_FORMAT_BASE64 4 +#define CRYPTUI_WIZ_EXPORT_FORMAT_SERIALIZED_CERT_STORE 5 + +typedef struct _CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO +{ + DWORD dwSize; + DWORD dwExportFormat; + BOOL fExportChain; + BOOL fExportPrivateKeys; + LPCWSTR pwszPassword; + BOOL fStrongEncryption; +} CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO, *PCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO; +typedef const CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO * + PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO; + +BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent, + LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid); + +/* Values for CRYPTUI_WIZ_IMPORT_SRC_INFO's dwSubjectChoice */ +#define CRYPTUI_WIZ_IMPORT_SUBJECT_FILE 1 +#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_CONTEXT 2 +#define CRYPTUI_WIZ_IMPORT_SUBJECT_CTL_CONTEXT 3 +#define CRYPTUI_WIZ_IMPORT_SUBJECT_CRL_CONTEXT 4 +#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE 5 + +typedef struct _CRYPTUI_WIZ_IMPORT_SUBJECT_INFO +{ + DWORD dwSize; + DWORD dwSubjectChoice; + union { + LPCWSTR pwszFileName; + PCCERT_CONTEXT pCertContext; + PCCTL_CONTEXT pCTLContext; + PCCRL_CONTEXT pCRLContext; + HCERTSTORE hCertStore; + } DUMMYUNIONNAME; + DWORD dwFlags; + LPCWSTR pwszPassword; +} CRYPTUI_WIZ_IMPORT_SRC_INFO, *PCRYPTUI_WIZ_IMPORT_SRC_INFO; +typedef const CRYPTUI_WIZ_IMPORT_SRC_INFO *PCCRYPTUI_WIZ_IMPORT_SRC_INFO; + +/* Values for CryptUIWizImport's dwFlags */ +#define CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE 0x00010000 +#define CRYPTUI_WIZ_IMPORT_ALLOW_CERT 0x00020000 +#define CRYPTUI_WIZ_IMPORT_ALLOW_CRL 0x00040000 +#define CRYPTUI_WIZ_IMPORT_ALLOW_CTL 0x00080000 +#define CRYPTUI_WIZ_IMPORT_TO_LOCALMACHINE 0x00100000 +#define CRYPTUI_WIZ_IMPORT_TO_CURRENTUSER 0x00200000 +#define CRYPTUI_WIZ_IMPORT_REMOTE_DEST_STORE 0x00400000 + +BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent, + LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, + HCERTSTORE hDestCertStore); + #include #ifdef __cplusplus diff --git a/include/d3d9caps.h b/include/d3d9caps.h index c66d291b05b..8ed6598c13e 100644 --- a/include/d3d9caps.h +++ b/include/d3d9caps.h @@ -67,6 +67,7 @@ #define D3DLINECAPS_BLEND 0x04 #define D3DLINECAPS_ALPHACMP 0x08 #define D3DLINECAPS_FOG 0x10 +#define D3DLINECAPS_ANTIALIAS 0x20 #define D3DPBLENDCAPS_ZERO 0x00000001 #define D3DPBLENDCAPS_ONE 0x00000002 diff --git a/include/d3drm.h b/include/d3drm.h index 316890074a0..4ee43542636 100644 --- a/include/d3drm.h +++ b/include/d3drm.h @@ -20,7 +20,7 @@ #define __D3DRM_H__ #include -/* #include */ +#include /* Direct3DRM Object CLSID */ diff --git a/include/d3drmobj.h b/include/d3drmobj.h index ca32ec92d0d..ab37ebc9a15 100644 --- a/include/d3drmobj.h +++ b/include/d3drmobj.h @@ -65,6 +65,9 @@ typedef struct _D3DRMPICKDESC2 /***************************************************************************** * IDirect3DRMObject interface */ +#ifdef WINE_NO_UNICODE_MACROS +#undef GetClassName +#endif #define INTERFACE IDirect3DRMObject DECLARE_INTERFACE_(IDirect3DRMObject,IUnknown) { diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 251d81d8f3d..12e8d943284 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -156,6 +156,9 @@ GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics*,GpBrush*,GDIPCONST GpRectF*,I GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics*,GpBrush*,GDIPCONST GpRect*,INT); GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics*,CompositingMode*); GpStatus WINGDIPAPI GdipGetClip(GpGraphics*,GpRegion*); +GpStatus WINGDIPAPI GdipSetClipRegion(GpGraphics*,GpRegion*,CombineMode); +GpStatus WINGDIPAPI GdipResetClip(GpGraphics*); +GpStatus WINGDIPAPI GdipIsClipEmpty(GpGraphics*, BOOL*); GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics*,CompositingQuality*); GpStatus WINGDIPAPI GdipGetDC(GpGraphics*,HDC*); GpStatus WINGDIPAPI GdipGetImageDimension(GpImage*,REAL*,REAL*); @@ -285,6 +288,7 @@ GpStatus WINGDIPAPI GdipCreatePath2(GDIPCONST GpPointF*,GDIPCONST BYTE*,INT, GpFillMode,GpPath**); GpStatus WINGDIPAPI GdipCreatePath2I(GDIPCONST GpPoint*,GDIPCONST BYTE*,INT,GpFillMode,GpPath**); GpStatus WINGDIPAPI GdipDeletePath(GpPath*); +GpStatus WINGDIPAPI GdipFlattenPath(GpPath*,GpMatrix*,REAL); GpStatus WINGDIPAPI GdipGetPathData(GpPath*,GpPathData*); GpStatus WINGDIPAPI GdipGetPathFillMode(GpPath*,GpFillMode*); GpStatus WINGDIPAPI GdipGetPathLastPoint(GpPath*,GpPointF*); @@ -336,6 +340,7 @@ GpStatus WINGDIPAPI GdipPathIterCopyData(GpPathIterator*,INT*,GpPointF*,BYTE*, INT,INT); GpStatus WINGDIPAPI GdipPathIterNextMarker(GpPathIterator*,INT*,INT*,INT*); GpStatus WINGDIPAPI GdipPathIterNextMarkerPath(GpPathIterator*,INT*,GpPath*); +GpStatus WINGDIPAPI GdipPathIterNextPathType(GpPathIterator*,INT*,BYTE*,INT*,INT*); GpStatus WINGDIPAPI GdipPathIterNextSubpath(GpPathIterator*,INT*,INT*,INT*,BOOL*); GpStatus WINGDIPAPI GdipPathIterNextSubpathPath(GpPathIterator*,INT*,GpPath*,BOOL*); GpStatus WINGDIPAPI GdipPathIterRewind(GpPathIterator*); @@ -432,8 +437,12 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC,GDIPCONST LOGFONTW*,GpFont**) GpStatus WINGDIPAPI GdipDeleteFont(GpFont*); GpStatus WINGDIPAPI GdipGetLogFontW(GpFont*,GpGraphics*,LOGFONTW*); GpStatus WINGDIPAPI GdipCloneFont(GpFont*,GpFont**); +GpStatus WINGDIPAPI GdipGetFamily(GpFont*, GpFontFamily**); GpStatus WINGDIPAPI GdipGetFontUnit(GpFont*, Unit*); GpStatus WINGDIPAPI GdipGetFontSize(GpFont*, REAL*); +GpStatus WINGDIPAPI GdipGetFontStyle(GpFont*, INT*); +GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont*, GDIPCONST GpGraphics*, + REAL*); GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont*, REAL, REAL*); GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR*, diff --git a/include/intshcut.h b/include/intshcut.h index 71c75143b97..842a9c07684 100644 --- a/include/intshcut.h +++ b/include/intshcut.h @@ -95,7 +95,17 @@ DECL_WINELIB_TYPE_AW(PURLINVOKECOMMANDINFO) DECL_WINELIB_TYPE_AW(CURLINVOKECOMMANDINFO) DECL_WINELIB_TYPE_AW(PCURLINVOKECOMMANDINFO) -BOOL WINAPI InetIsOffline(DWORD); + +typedef enum translateurl_in_flags { + TRANSLATEURL_FL_GUESS_PROTOCOL=1, + TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL +} TRANSLATEURL_IN_FLAGS; + +HRESULT WINAPI TranslateURLA(LPCSTR, DWORD, LPSTR *); +HRESULT WINAPI TranslateURLW(LPCWSTR, DWORD, LPWSTR *); +#define TranslateURL WINELIB_NAME_AW(TranslateURL) + +BOOL WINAPI InetIsOffline(DWORD); #ifdef __cplusplus } diff --git a/include/shobjidl.idl b/include/shobjidl.idl index 31d211db0b8..23a1fdebb9a 100644 --- a/include/shobjidl.idl +++ b/include/shobjidl.idl @@ -1349,3 +1349,28 @@ interface IFileSystemBindData : IUnknown HRESULT GetFindData( [out] WIN32_FIND_DATAW *pfd); } + +/***************************************************************************** + * ITaskbarList interface + */ +[ + object, + uuid(56FDF342-FD6D-11d0-958A-006097C9A090), + pointer_default(unique) +] +interface ITaskbarList : IUnknown +{ + HRESULT HrInit(); + + HRESULT AddTab( + [in] HWND hwnd); + + HRESULT DeleteTab( + [in] HWND hwnd); + + HRESULT ActivateTab( + [in] HWND hwnd); + + HRESULT SetActiveAlt( + [in] HWND hwnd); +} diff --git a/include/winbase.h b/include/winbase.h index cf0345baa0a..f7ccb8c7639 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1338,6 +1338,7 @@ WINBASEAPI INT WINAPI CompareFileTime(const FILETIME*,const FILETIME*); WINBASEAPI BOOL WINAPI ConvertFiberToThread(void); WINBASEAPI LPVOID WINAPI ConvertThreadToFiber(LPVOID); WINBASEAPI LPVOID WINAPI ConvertThreadToFiberEx(LPVOID,DWORD); +WINADVAPI BOOL WINAPI ConvertToAutoInheritPrivateObjectSecurity(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR*,GUID*,BOOL,PGENERIC_MAPPING); WINBASEAPI HANDLE WINAPI CreateActCtxA(PCACTCTXA); WINBASEAPI HANDLE WINAPI CreateActCtxW(PCACTCTXW); #define CreateActCtx WINELIB_NAME_AW(CreateActCtx) diff --git a/include/wincrypt.h b/include/wincrypt.h index 0f0cec6e198..ba16cd5dab5 100644 --- a/include/wincrypt.h +++ b/include/wincrypt.h @@ -2685,6 +2685,33 @@ typedef struct _CRL_FIND_ISSUED_FOR_PARA PCCERT_CONTEXT pIssuerCert; } CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA; +#define CTL_FIND_ANY 0 +#define CTL_FIND_SHA1_HASH 1 +#define CTL_FIND_MD5_HASH 2 +#define CTL_FIND_USAGE 3 +#define CTL_FIND_SUBJECT 4 +#define CTL_FIND_EXISTING 5 + +typedef struct _CTL_FIND_USAGE_PARA +{ + DWORD cbSize; + CTL_USAGE SubjectUsage; + CRYPT_DATA_BLOB ListIdentifier; + PCERT_INFO pSigner; +} CTL_FIND_USAGE_PARA, *PCTL_FIND_USAGE_PARA; + +#define CTL_FIND_NO_LIST_ID_CBDATA 0xffffffff +#define CTL_FIND_NO_SIGNER_PTR ((PCERT_INFO)-1) +#define CTL_FIND_SAME_USAGE_FLAG 0x00000001 + +typedef struct _CTL_FIND_SUBJECT_PARA +{ + DWORD cbSize; + PCTL_FIND_USAGE_PARA pUsagePara; + DWORD dwSubjectType; + void *pvSubject; +} CTL_FIND_SUBJECT_PARA, *PCTL_FIND_SUBJECT_PARA; + /* PFN_CERT_STORE_PROV_WRITE_CERT dwFlags values */ #define CERT_STORE_PROV_WRITE_ADD_FLAG 0x1 @@ -2947,8 +2974,8 @@ typedef struct _CRL_FIND_ISSUED_FOR_PARA #endif #define szOID_REMOVE_CERTIFICATE "1.3.6.1.4.1.311.10.8.1" #define szOID_CROSS_CERT_DIST_POINTS "1.3.6.1.4.1.311.10.9.1" -#define szOID_CTL "1.3.6.1.4.1.311.10.10.1" -#define szOID_SORTED_CTL "1.3.6.1.4.1.311.10.10.1.1" +#define szOID_CTL "1.3.6.1.4.1.311.10.1" +#define szOID_SORTED_CTL "1.3.6.1.4.1.311.10.1.1" #define szOID_ANY_APPLICATION_POLICY "1.3.6.1.4.1.311.10.12.1" #define szOID_RENEWAL_CERTIFICATE "1.3.6.1.4.1.311.13.1" #define szOID_ENROLLMENT_NAME_VALUE_PAIR "1.3.6.1.4.1.311.13.2.1" diff --git a/include/wine/wined3d_caps.h b/include/wine/wined3d_caps.h index 91fa788bdb9..1cfbbd49bf5 100644 --- a/include/wine/wined3d_caps.h +++ b/include/wine/wined3d_caps.h @@ -53,6 +53,7 @@ #define WINED3DLINECAPS_BLEND 0x00000004 #define WINED3DLINECAPS_ALPHACMP 0x00000008 #define WINED3DLINECAPS_FOG 0x00000010 +#define WINED3DLINECAPS_ANTIALIAS 0x00000020 #define WINED3DMAX30SHADERINSTRUCTIONS 32768 #define WINED3DMIN30SHADERINSTRUCTIONS 512 diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h index d2c8a2cf561..4b960d55221 100644 --- a/include/wine/wined3d_interface.h +++ b/include/wine/wined3d_interface.h @@ -810,7 +810,6 @@ DECLARE_INTERFACE_(IWineD3DBaseTexture,IWineD3DResource) STDMETHOD_(BOOL, SetDirty)(THIS_ BOOL) PURE; STDMETHOD_(BOOL, GetDirty)(THIS) PURE; STDMETHOD(BindTexture)(THIS) PURE; - STDMETHOD(UnBindTexture)(THIS) PURE; STDMETHOD_(UINT, GetTextureDimensions)(THIS) PURE; STDMETHOD_(BOOL, IsCondNP2)(THIS) PURE; STDMETHOD_(void, ApplyStateChanges)(THIS_ const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) PURE; @@ -846,7 +845,6 @@ DECLARE_INTERFACE_(IWineD3DBaseTexture,IWineD3DResource) #define IWineD3DBaseTexture_GetDirty(p) (p)->lpVtbl->GetDirty(p) /*** internal methods ***/ #define IWineD3DBaseTexture_BindTexture(p) (p)->lpVtbl->BindTexture(p) -#define IWineD3DBaseTexture_UnBindTexture(p) (p)->lpVtbl->UnBindTexture(p) #define IWineD3DBaseTexture_GetTextureDimensions(p) (p)->lpVtbl->GetTextureDimensions(p) #define IWineD3DBaseTexture_IsCondNP2(p) (p)->lpVtbl->IsCondNP2(p) #define IWineD3DBaseTexture_ApplyStateChanges(p,a,b) (p)->lpVtbl->ApplyStateChanges(p,a,b) @@ -884,7 +882,6 @@ DECLARE_INTERFACE_(IWineD3DTexture,IWineD3DBaseTexture) STDMETHOD_(BOOL, SetDirty)(THIS_ BOOL) PURE; STDMETHOD_(BOOL, GetDirty)(THIS) PURE; STDMETHOD(BindTexture)(THIS) PURE; - STDMETHOD(UnBindTexture)(THIS) PURE; STDMETHOD_(UINT, GetTextureDimensions)(THIS) PURE; STDMETHOD_(BOOL, IsCondNP2)(THIS) PURE; STDMETHOD_(void, ApplyStateChanges)(THIS_ const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) PURE; @@ -925,7 +922,6 @@ DECLARE_INTERFACE_(IWineD3DTexture,IWineD3DBaseTexture) #define IWineD3DTexture_SetDirty(p,a) (p)->lpVtbl->SetDirty(p,a) #define IWineD3DTexture_GetDirty(p) (p)->lpVtbl->GetDirty(p) #define IWineD3DTexture_BindTexture(p) (p)->lpVtbl->BindTexture(p) -#define IWineD3DTexture_UnBindTexture(p) (p)->lpVtbl->UnBindTexture(p) #define IWineD3DTexture_GetTextureDimensions(p) (p)->lpVtbl->GetTextureDimensions(p) #define IWineD3DTexture_IsCondNP2(p) (p)->lpVtbl->IsCondNP2(p) #define IWineD3DTexture_ApplyStateChanges(p,a,b) (p)->lpVtbl->ApplyStateChanges(p,a,b) @@ -970,7 +966,6 @@ DECLARE_INTERFACE_(IWineD3DCubeTexture,IWineD3DBaseTexture) STDMETHOD_(BOOL, SetDirty)(THIS_ BOOL) PURE; STDMETHOD_(BOOL, GetDirty)(THIS) PURE; STDMETHOD(BindTexture)(THIS) PURE; - STDMETHOD(UnBindTexture)(THIS) PURE; STDMETHOD_(UINT, GetTextureDimensions)(THIS) PURE; STDMETHOD_(BOOL, IsCondNP2)(THIS) PURE; STDMETHOD_(void, ApplyStateChanges)(THIS_ DWORD const textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) PURE; @@ -1011,7 +1006,6 @@ DECLARE_INTERFACE_(IWineD3DCubeTexture,IWineD3DBaseTexture) #define IWineD3DCubeTexture_SetDirty(p,a) (p)->lpVtbl->SetDirty(p,a) #define IWineD3DCubeTexture_GetDirty(p) (p)->lpVtbl->GetDirty(p) #define IWineD3DCubeTexture_BindTexture(p) (p)->lpVtbl->BindTexture(p) -#define IWineD3DCubeTexture_UnBindTexture(p) (p)->lpVtbl->UnBindTexture(p) #define IWineD3DCubeTexture_GetTextureDimensions(p) (p)->lpVtbl->GetTextureDimensions(p) #define IWineD3DCubeTexture_IsCondNP2(p) (p)->lpVtbl->IsCondNP2(p) #define IWineD3DCubeTexture_ApplyStateChanges(p,a,b) (p)->lpVtbl->ApplyStateChanges(p,a,b) @@ -1057,7 +1051,6 @@ DECLARE_INTERFACE_(IWineD3DVolumeTexture,IWineD3DBaseTexture) STDMETHOD_(BOOL, SetDirty)(THIS_ BOOL) PURE; STDMETHOD_(BOOL, GetDirty)(THIS) PURE; STDMETHOD(BindTexture)(THIS) PURE; - STDMETHOD(UnBindTexture)(THIS) PURE; STDMETHOD_(UINT, GetTextureDimensions)(THIS) PURE; STDMETHOD_(BOOL, IsCondNP2)(THIS) PURE; STDMETHOD_(void, ApplyStateChanges)(THIS_ const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1], const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) PURE; @@ -1098,7 +1091,6 @@ DECLARE_INTERFACE_(IWineD3DVolumeTexture,IWineD3DBaseTexture) #define IWineD3DVolumeTexture_SetDirty(p,a) (p)->lpVtbl->SetDirty(p,a) #define IWineD3DVolumeTexture_GetDirty(p) (p)->lpVtbl->GetDirty(p) #define IWineD3DVolumeTexture_BindTexture(p) (p)->lpVtbl->BindTexture(p) -#define IWineD3DVolumeTexture_UnBindTexture(p) (p)->lpVtbl->UnBindTexture(p) #define IWineD3DVolumeTexture_GetTextureDimensions(p) (p)->lpVtbl->GetTextureDimensions(p) #define IWineD3DVolumeTexture_IsCondNP2(p) (p)->lpVtbl->IsCondNP2(p) #define IWineD3DVolumeTexture_ApplyStateChanges(p,a,b) (p)->lpVtbl->ApplyStateChanges(p,a,b) diff --git a/include/wine/wined3d_types.h b/include/wine/wined3d_types.h index bf35b9fc8dc..5b722e775c0 100644 --- a/include/wine/wined3d_types.h +++ b/include/wine/wined3d_types.h @@ -305,6 +305,8 @@ typedef enum _WINED3DFORMAT { /* Vendor specific formats */ WINED3DFMT_ATI2N = WINEMAKEFOURCC('A', 'T', 'I', '2'), + WINED3DFMT_NVHU = WINEMAKEFOURCC('N', 'V', 'H', 'U'), + WINED3DFMT_NVHS = WINEMAKEFOURCC('N', 'V', 'H', 'S'), WINED3DFMT_FORCE_DWORD = 0xFFFFFFFF } WINED3DFORMAT; diff --git a/programs/clock/Zh.rc b/programs/clock/Zh.rc index 5d0d9e07d44..5bad6fd6642 100644 --- a/programs/clock/Zh.rc +++ b/programs/clock/Zh.rc @@ -1,7 +1,8 @@ /* - * Clock ( Simplified Chinese resources) + * Clock ( Simplified and Traditional Chinese Language Support) * * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,29 +19,65 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +MAIN_MENU MENU +{ + POPUP "属性(&P)" { + MENUITEM "模拟时钟(&L)", IDM_ANALOG + MENUITEM "数字时钟(&T)", IDM_DIGITAL + MENUITEM SEPARATOR + MENUITEM "字体(&F)...", IDM_FONT + MENUITEM SEPARATOR + MENUITEM "无标题栏(&W)", IDM_NOTITLE + MENUITEM SEPARATOR + MENUITEM "秒(&S)", IDM_SECONDS + MENUITEM "日期(&D)", IDM_DATE + MENUITEM SEPARATOR + MENUITEM "总是在最前面(&A)", IDM_ONTOP + } + POPUP "资料信息(&O)" { + MENUITEM "用户许可协议(&L)...", IDM_LICENSE + MENUITEM "责任无关(&N)...", IDM_NOWARRANTY + MENUITEM "关于 Wine(&A)...", IDM_ABOUT + } +} + +STRINGTABLE DISCARDABLE +{ +IDS_CLOCK, "时钟" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +MAIN_MENU MENU { - POPUP "ÊôÐÔ£¨&P£©" { - MENUITEM "Ä£ÄâʱÖÓ£¨&L£©", IDM_ANALOG - MENUITEM "Êý×ÖʱÖÓ£¨&T£©", IDM_DIGITAL + POPUP "屬性(&P)" { + MENUITEM "模擬時鐘(&L)", IDM_ANALOG + MENUITEM "數字時鐘(&T)", IDM_DIGITAL MENUITEM SEPARATOR - MENUITEM "×ÖÌ壨&F£©...", IDM_FONT + MENUITEM "字型(&F)...", IDM_FONT MENUITEM SEPARATOR - MENUITEM "ÎÞ±êÌâÀ¸£¨&W£©", IDM_NOTITLE + MENUITEM "無標題欄(&W)", IDM_NOTITLE MENUITEM SEPARATOR - MENUITEM "Ã루&S£©", IDM_SECONDS - MENUITEM "ÈÕÆÚ£¨&D£©", IDM_DATE + MENUITEM "秒(&S)", IDM_SECONDS + MENUITEM "日期(&D)", IDM_DATE MENUITEM SEPARATOR - MENUITEM "×ÜÊÇÔÚ×îÇ°Ã棨&A£©", IDM_ONTOP + MENUITEM "總是在最上面(&A)", IDM_ONTOP } - POPUP "×ÊÁÏÐÅÏ¢£¨&O£©" { - MENUITEM "Óû§Ðí¿ÉЭÒ飨&L£©...", IDM_LICENSE - MENUITEM "ÔðÈÎÎ޹أ¨&N£©...", IDM_NOWARRANTY - MENUITEM "¹ØÓÚ Wine£¨&A£©...", IDM_ABOUT + POPUP "資料資訊(&O)" { + MENUITEM "用戶許可協議(&L)...", IDM_LICENSE + MENUITEM "責任無關(&N)...", IDM_NOWARRANTY + MENUITEM "關於 Wine(&A)...", IDM_ABOUT } } -STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +STRINGTABLE DISCARDABLE { -IDS_CLOCK, "ʱÖÓ" +IDS_CLOCK, "時鐘" } + +#pragma code_page(default) diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 8b82d9a5a40..07e683a8aa2 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -430,6 +430,14 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds) return ret; } +static void do_hide_systray(void) +{ + SetWindowPos( tray_window, 0, + GetSystemMetrics(SM_XVIRTUALSCREEN) + GetSystemMetrics(SM_CXVIRTUALSCREEN), + GetSystemMetrics(SM_YVIRTUALSCREEN) + GetSystemMetrics(SM_CYVIRTUALSCREEN), + 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); +} + static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) @@ -437,6 +445,10 @@ static LRESULT WINAPI tray_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l case WM_COPYDATA: return handle_incoming((HWND)wparam, (COPYDATASTRUCT *)lparam); + case WM_DISPLAYCHANGE: + if (hide_systray) do_hide_systray(); + break; + case WM_TIMER: cleanup_destroyed_windows(); break; @@ -568,5 +580,8 @@ void initialize_systray(void) WINE_ERR("Could not create tray window\n"); return; } + + if (hide_systray) do_hide_systray(); + SetTimer( tray_window, 1, 2000, NULL ); } diff --git a/programs/notepad/Zh.rc b/programs/notepad/Zh.rc dissimilarity index 61% index 57dea33479d..771bb92f65b 100644 --- a/programs/notepad/Zh.rc +++ b/programs/notepad/Zh.rc @@ -1,117 +1,216 @@ -/* - * Notepad (Simplified Chinese resources) - * - * Copyright 2002 liuspider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ - POPUP "Îļþ£¨&F£©" { - MENUITEM "н¨£¨&N£©\tCtrl+N", CMD_NEW - MENUITEM "´ò¿ª£¨&O£©...\tCtrl+O", CMD_OPEN - MENUITEM "±£´æ£¨&S£©\tCtrl+S", CMD_SAVE - MENUITEM "Áí´æΪ(&A)...", CMD_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "´òÓ¡£¨&P£©...\tCtrl+P", CMD_PRINT - MENUITEM "Ò³ÃæÉèÖã¨&T£©...", CMD_PAGE_SETUP - MENUITEM "´òÓ¡ÉèÖã¨&R£©...", CMD_PRINTER_SETUP - MENUITEM SEPARATOR - MENUITEM "Í˳ö£¨&E£©", CMD_EXIT - } -POPUP "±à¼­£¨&E£©" { - MENUITEM "³·Ïû£¨&U£©\tCtrl+Z", CMD_UNDO - MENUITEM SEPARATOR - MENUITEM "¼ôÇУ¨&T£©\tCtrl+X", CMD_CUT - MENUITEM "¸´ÖÆ£¨&C£©\tCtrl+C", CMD_COPY - MENUITEM "Õ³Ìù£¨&P£©\tCtrl+V", CMD_PASTE - MENUITEM "ɾ³ý£¨&D£©\tDel", CMD_DELETE - MENUITEM SEPARATOR - MENUITEM "È«Ñ¡£¨&A£©", CMD_SELECT_ALL - MENUITEM "²åÈëÈÕÆÚ¡¢Ê±¼ä£¨&T£©\tF5", CMD_TIME_DATE - MENUITEM SEPARATOR - MENUITEM "×Ô¶¯»»ÐУ¨&W£©", CMD_WRAP - MENUITEM "×ÖÌ壨&F£©...", CMD_FONT /* FIXME */ - } -POPUP "ËÑË÷£¨&S£©" { - MENUITEM "ËÑË÷£¨&S£©...", CMD_SEARCH - MENUITEM "ËÑË÷ÏÂÒ»¸ö£¨&S£©\tF3", CMD_SEARCH_NEXT - } -POPUP "°ïÖú£¨&H£©" { - MENUITEM "ÄÚÈÝ£¨&C£©", CMD_HELP_CONTENTS - MENUITEM "ËÑË÷£¨&S£©...", CMD_HELP_SEARCH - MENUITEM "ÈçºÎʹÓðïÖú£¨&H£©", CMD_HELP_ON_HELP - MENUITEM SEPARATOR - MENUITEM "¹ØÓÚ¼Çʱ¾£¨&A£©", CMD_HELP_ABOUT_NOTEPAD - } -} - -/* Dialog `Page setup' */ - -DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 10, "MS Shell Dlg" -CAPTION "Ò³ÃæÉèÖÃ" -{ -LTEXT "ҳü£¨&H£©:", 0x140, 10, 07, 40, 15 -EDITTEXT IDC_PAGESETUP_HEADERVALUE, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "½Å×¢£¨&F£©:", 0x142, 10, 24, 40, 15 -EDITTEXT IDC_PAGESETUP_FOOTERVALUE, 60, 22,110, 12, WS_BORDER | WS_TABSTOP - -GROUPBOX "±ßÔµ¿Õ°×£¨&M£©£º", 0x144, 10, 43,160, 45 -LTEXT "×ó£¨&L£©£º", 0x145, 20, 55, 30, 10, WS_CHILD -EDITTEXT IDC_PAGESETUP_LEFTVALUE, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "ÉÏ£¨&T£©£º", 0x148, 20, 73, 30, 10, WS_CHILD -EDITTEXT IDC_PAGESETUP_TOPVALUE, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "ÓÒ£¨&R£©£º", 0x14B, 100, 55, 30, 10, WS_CHILD -EDITTEXT IDC_PAGESETUP_RIGHTVALUE, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "Ï£¨&B£©£º", 0x14E,100, 73, 30, 10, WS_CHILD -EDITTEXT IDC_PAGESETUP_BOTTOMVALUE, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP - -DEFPUSHBUTTON "È·¶¨", IDOK, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", IDHELP, 180, 39, 40, 15, WS_TABSTOP -} - -STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ -STRING_PAGESETUP_HEADERVALUE, "&f" -STRING_PAGESETUP_FOOTERVALUE, "&p ҳ" - -STRING_NOTEPAD, "¼Çʱ¾" -STRING_ERROR, "´íÎó" -STRING_WARNING, "¾¯¸æ" -STRING_INFO, "ÐÅÏ¢" - -STRING_UNTITLED, "£¨Î´ÃüÃû£©" - -STRING_ALL_FILES, "ËùÓÐÎļþ (*.*)" -STRING_TEXT_FILES_TXT, "Îı¾Îļþ (*.txt)" - -STRING_TOOLARGE, "¼Çʱ¾²»ÄÜ´ò¿ª '%s' Õâô´óµÄÎļþ¡£\n \ -ÇëʹÓñðµÄ±à¼­Æ÷¡£" -STRING_NOTEXT, "ÄúûÓÐÊäÈëÈκÎÎı¾¡£ \ -\nÇëÊäÈëһЩÔÙÊÔ" -STRING_DOESNOTEXIST, "Îļþ '%s'\n²»´æÔÚ\n\n \ -ÄúÏëн¨Ò»¸öÎļþÂð£¿" -STRING_NOTSAVED, "Îļþ '%s'\nÕýÎÄÒѸü¸Ä\n\n \ -ÊÇ·ñ±£´æ¸ü¸Ä£¿" -STRING_NOTFOUND, "ÕÒ²»µ½Îļþ '%s'" -STRING_OUT_OF_MEMORY, "ûÓÐ×ã¹»µÄÄÚ´æ¿ÉÒÔÓÃÀ´Íê³É´ËÏîÈÎÎñ¡£ \ -\nÇë¹Ø±ÕһЩ³ÌÐòÊ©·ÅÄÚ´æºóÔÙÊÔ¡£" - -} +/* + * Notepad (Simplified and Traditional Chinese resources) + * + * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +{ + POPUP "文件(&F)" { + MENUITEM "新建(&N)\tCtrl+N", CMD_NEW + MENUITEM "打开(&O)...\tCtrl+O", CMD_OPEN + MENUITEM "保存(&S)\tCtrl+S", CMD_SAVE + MENUITEM "另存为(&A)...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "打印(&P)...\tCtrl+P", CMD_PRINT + MENUITEM "页面设置(&T)...", CMD_PAGE_SETUP + MENUITEM "打印设置(&R)...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "退出(&E)", CMD_EXIT + } +POPUP "编辑(&E)" { + MENUITEM "撤消(&U)\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "剪切(&T)\tCtrl+X", CMD_CUT + MENUITEM "复制(&C)\tCtrl+C", CMD_COPY + MENUITEM "粘贴(&P)\tCtrl+V", CMD_PASTE + MENUITEM "删除(&D)\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "全选(&A)", CMD_SELECT_ALL + MENUITEM "插入日期、时间(&T)\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "自动换行(&W)", CMD_WRAP + MENUITEM "字体(&F)...", CMD_FONT + } +POPUP "搜索(&S)" { + MENUITEM "搜索(&S)...", CMD_SEARCH + MENUITEM "搜索下一个(&S)\tF3", CMD_SEARCH_NEXT + } +POPUP "帮助(&H)" { + MENUITEM "内容(&C)", CMD_HELP_CONTENTS + MENUITEM "搜索(&S)...", CMD_HELP_SEARCH + MENUITEM "如何使用帮助(&H)", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + MENUITEM "关于记事本(&A)", CMD_HELP_ABOUT_NOTEPAD + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 10, "MS Shell Dlg" +CAPTION "页面设置" +{ +LTEXT "页眉(&H):", 0x140, 10, 07, 40, 15 +EDITTEXT IDC_PAGESETUP_HEADERVALUE, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "脚注(&F):", 0x142, 10, 24, 40, 15 +EDITTEXT IDC_PAGESETUP_FOOTERVALUE, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "边缘空白(&M):", 0x144, 10, 43,160, 45 +LTEXT "左(&L):", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_LEFTVALUE, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "上(&T):", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_TOPVALUE, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_RIGHTVALUE, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_BOTTOMVALUE, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "确定", IDOK, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", IDHELP, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +{ +STRING_PAGESETUP_HEADERVALUE, "&f" +STRING_PAGESETUP_FOOTERVALUE, "&p 页" + +STRING_NOTEPAD, "记事本" +STRING_ERROR, "错误" +STRING_WARNING, "警告" +STRING_INFO, "信息" + +STRING_UNTITLED, "(未命名)" + +STRING_ALL_FILES, "所有文件 (*.*)" +STRING_TEXT_FILES_TXT, "文本文件 (*.txt)" + +STRING_TOOLARGE, "记事本不能打开 '%s' 这么大的文件。\n \ +请使用别的编辑器。" +STRING_NOTEXT, "您没有输入任何文本。 \ +\n请输入一些再试" +STRING_DOESNOTEXIST, "文件 '%s'\n不存在\n\n \ +您想新建一个文件吗?" +STRING_NOTSAVED, "文件 '%s'\n正文已更改\n\n \ +是否保存更改?" +STRING_NOTFOUND, "找不到: '%s'" +STRING_OUT_OF_MEMORY, "没有足够的内存可以用来完成此项任务。 \ +\n请关闭一些程序后再试。" + +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +MAIN_MENU MENU +{ + POPUP "檔案(&F)" { + MENUITEM "新建(&N)\tCtrl+N", CMD_NEW + MENUITEM "開啟(&O)...\tCtrl+O", CMD_OPEN + MENUITEM "儲存(&S)\tCtrl+S", CMD_SAVE + MENUITEM "另存為(&A)...", CMD_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "列印(&P)...\tCtrl+P", CMD_PRINT + MENUITEM "版面設定(&T)...", CMD_PAGE_SETUP + MENUITEM "列印設定(&R)...", CMD_PRINTER_SETUP + MENUITEM SEPARATOR + MENUITEM "結束(&E)", CMD_EXIT + } +POPUP "編輯(&E)" { + MENUITEM "復原(&U)\tCtrl+Z", CMD_UNDO + MENUITEM SEPARATOR + MENUITEM "剪下(&T)\tCtrl+X", CMD_CUT + MENUITEM "複製(&C)\tCtrl+C", CMD_COPY + MENUITEM "貼上(&P)\tCtrl+V", CMD_PASTE + MENUITEM "刪除(&D)\tDel", CMD_DELETE + MENUITEM SEPARATOR + MENUITEM "全選(&A)", CMD_SELECT_ALL + MENUITEM "插入日期時間(&T)\tF5", CMD_TIME_DATE + MENUITEM SEPARATOR + MENUITEM "自動換行(&W)", CMD_WRAP + MENUITEM "字型(&F)...", CMD_FONT + } +POPUP "搜尋(&S)" { + MENUITEM "尋找(&S)...", CMD_SEARCH + MENUITEM "找下一個(&N)\tF3", CMD_SEARCH_NEXT + } +POPUP "幫助(&H)" { + MENUITEM "主要內容(&C)", CMD_HELP_CONTENTS + MENUITEM "搜尋(&S)...", CMD_HELP_SEARCH + MENUITEM "如何使用幫助(&H)", CMD_HELP_ON_HELP + MENUITEM SEPARATOR + MENUITEM "關於記事本(&A)", CMD_HELP_ABOUT_NOTEPAD + } +} + +/* Dialog `Page setup' */ + +DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 10, "MS Song" +CAPTION "版面設定" +{ +LTEXT "頁首(&H):", 0x140, 10, 07, 40, 15 +EDITTEXT IDC_PAGESETUP_HEADERVALUE, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "腳註(&F):", 0x142, 10, 24, 40, 15 +EDITTEXT IDC_PAGESETUP_FOOTERVALUE, 60, 22,110, 12, WS_BORDER | WS_TABSTOP + +GROUPBOX "邊緣空白(&M):", 0x144, 10, 43,160, 45 +LTEXT "左(&L):", 0x145, 20, 55, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_LEFTVALUE, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "上(&T):", 0x148, 20, 73, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_TOPVALUE, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_RIGHTVALUE, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP +LTEXT "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD +EDITTEXT IDC_PAGESETUP_BOTTOMVALUE, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP + +DEFPUSHBUTTON "確定", IDOK, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", IDHELP, 180, 39, 40, 15, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ +STRING_PAGESETUP_HEADERVALUE, "&f" +STRING_PAGESETUP_FOOTERVALUE, "&p 頁" + +STRING_NOTEPAD, "記事本" +STRING_ERROR, "錯誤" +STRING_WARNING, "警告" +STRING_INFO, "信息" + +STRING_UNTITLED, "(未命名)" + +STRING_ALL_FILES, "所有檔案 (*.*)" +STRING_TEXT_FILES_TXT, "文本檔案 (*.txt)" + +STRING_TOOLARGE, "記事本不能開啟 '%s' 這麼大的檔案, \n請使用別的編輯器。" +STRING_NOTEXT, "您沒有輸入任何文本。\n請輸入一些再試" +STRING_DOESNOTEXIST, "檔案 '%s'\n不存在\n\n您想新建一個檔案嗎?" +STRING_NOTSAVED, "檔案 '%s'\n正文已更改\n\n是否儲存更改?" +STRING_NOTFOUND, "找不到: '%s'" +STRING_OUT_OF_MEMORY, "沒有足夠的內存來完成此項任務, \n請關閉一些程式後再試。" +} + +#pragma code_page(default) diff --git a/programs/progman/Zh.rc b/programs/progman/Zh.rc index 70535cdc413..5b2eb11ec94 100644 --- a/programs/progman/Zh.rc +++ b/programs/progman/Zh.rc @@ -1,8 +1,9 @@ /* * Program Manager - * Simplified Chinese Language Support + * Simplified and Traditional Chinese Language Support * * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,45 +20,50 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + /* Menu */ -MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +MAIN_MENU MENU { - POPUP "Îļþ£¨&F£©" { - MENUITEM "н¨£¨&N£©...", PM_NEW - MENUITEM "´ò¿ª£¨&O£©\tEnter", PM_OPEN - MENUITEM "Òƶ¯£¨&M£©...\tF7", PM_MOVE, GRAYED - MENUITEM "¸´ÖÆ£¨&C£©...\tF8", PM_COPY, GRAYED - MENUITEM "ɾ³ý£¨&D£©\tEntf", PM_DELETE - MENUITEM "ÊôÐÔ£¨&A£©...\tAlt+Enter", PM_ATTRIBUTES + POPUP "文件(&F)" { + MENUITEM "新建(&N)...", PM_NEW + MENUITEM "打开(&O)\tEnter", PM_OPEN + MENUITEM "移动(&M)...\tF7", PM_MOVE, GRAYED + MENUITEM "复制(&C)...\tF8", PM_COPY, GRAYED + MENUITEM "删除(&D)\tEntf", PM_DELETE + MENUITEM "属性(&A)...\tAlt+Enter", PM_ATTRIBUTES MENUITEM SEPARATOR - MENUITEM "Ö´ÐУ¨&E£©...", PM_EXECUTE + MENUITEM "执行(&E)...", PM_EXECUTE MENUITEM SEPARATOR - MENUITEM "Í˳ö Windows£¨&X£©...", PM_EXIT + MENUITEM "退出 Windows(&X)...", PM_EXIT } - POPUP "Ñ¡Ï&O£©" { - MENUITEM "×Ô¶¯ÅÅÁУ¨&A)", PM_AUTO_ARRANGE - MENUITEM "ÔËÐÐʱ×îС»¯£¨&M£©", PM_MIN_ON_RUN - MENUITEM "Í˳öʱ±£´æÉèÖã¨&S£©", PM_SAVE_SETTINGS + POPUP "选项(&O)" { + MENUITEM "自动排列(&A)", PM_AUTO_ARRANGE + MENUITEM "运行时最小化(&M)", PM_MIN_ON_RUN + MENUITEM "退出时保存设置(&S)", PM_SAVE_SETTINGS } - POPUP "´°¿Ú£¨&W£©" { - MENUITEM "²ãµþ£¨&O£©\tShift+F5", PM_OVERLAP - MENUITEM "²¢ÅÅ£¨&S£©\tShift+F4", PM_SIDE_BY_SIDE - MENUITEM "ÅÅÁÐͼ±ê£¨&A£©", PM_ARRANGE + POPUP "窗口(&W)" { + MENUITEM "层叠(&O)\tShift+F5", PM_OVERLAP + MENUITEM "并排(&S)\tShift+F4", PM_SIDE_BY_SIDE + MENUITEM "排列图标(&A)", PM_ARRANGE } -POPUP "°ïÖú£¨&H£©" { - MENUITEM "ÄÚÈÝ£¨&C£©", PM_CONTENTS - MENUITEM "ËÑË÷£¨&S£©...", PM_SEARCH +POPUP "帮助(&H)" { + MENUITEM "内容(&C)", PM_CONTENTS + MENUITEM "搜索(&S)...", PM_SEARCH MENUITEM SEPARATOR - MENUITEM "ÈçºÎʹÓðïÖú£¨&H£©", PM_HELPONHELP - MENUITEM "½Ì³Ì£¨&T£©", PM_TUTORIAL + MENUITEM "如何使用帮助(&H)", PM_HELPONHELP + MENUITEM "教程(&T)", PM_TUTORIAL MENUITEM SEPARATOR - POPUP "×ÊÁÏÐÅÏ¢£¨&I£©..." { - MENUITEM "Óû§Ðí¿ÉЭÒ飨&L£©", PM_LICENSE - MENUITEM "ÔðÈÎÎ޹أ¨&N£©", PM_NO_WARRANTY - MENUITEM "¹ØÓÚ Wine£¨&A£©", PM_ABOUT_WINE + POPUP "资料信息(&I)..." { + MENUITEM "用户许可协议(&L)", PM_LICENSE + MENUITEM "责任无关(&N)", PM_NO_WARRANTY + MENUITEM "关于 Wine(&A)", PM_ABOUT_WINE } } } @@ -65,157 +71,344 @@ POPUP " /* Dialog `New' */ DIALOG_NEW DIALOG 0, 0, 170, 65 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "н¨" +CAPTION "新建" { RADIOBUTTON "", PM_NEW_GROUP, 10, 15, 10, 15 -LTEXT "³ÌÐò×飨&G£©", PM_NEW_GROUP, 20, 18, 80, 15 +LTEXT "程序组(&G)", PM_NEW_GROUP, 20, 18, 80, 15 RADIOBUTTON "", PM_NEW_PROGRAM, 10, 35, 10, 15 -LTEXT "³ÌÐò£¨&P£©", PM_NEW_PROGRAM, 20, 38, 80, 15 -DEFPUSHBUTTON "È·¶¨", IDOK, 105, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 105, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 105, 45, 60, 15, WS_TABSTOP +LTEXT "程序(&P)", PM_NEW_PROGRAM, 20, 38, 80, 15 +DEFPUSHBUTTON "确定", IDOK, 105, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 105, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 105, 45, 60, 15, WS_TABSTOP } /* Dialog `Move' */ DIALOG_MOVE DIALOG 0, 0, 250, 65 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Òƶ¯³ÌÐò" +CAPTION "移动程序" { -LTEXT "Òƶ¯³ÌÐò£º", IDIGNORE, 5, 5, 90, 15 +LTEXT "移动程序:", IDIGNORE, 5, 5, 90, 15 LTEXT "", PM_PROGRAM, 95, 5, 90, 15 -LTEXT "´Ó´Ë³ÌÐò×éÖУº", IDIGNORE, 5, 13, 90, 15 +LTEXT "从此程序组中:", IDIGNORE, 5, 13, 90, 15 LTEXT "", PM_FROM_GROUP, 95, 13, 90, 15 -LTEXT "Òƶ¯µ½³ÌÐò×飨&T£©£º", PM_TO_GROUP_TXT, 5, 28, 140, 15 +LTEXT "移动到程序组(&T):", PM_TO_GROUP_TXT, 5, 28, 140, 15 COMBOBOX PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST -DEFPUSHBUTTON "È·¶¨", IDOK, 185, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 185, 45, 60, 15, WS_TABSTOP +DEFPUSHBUTTON "确定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 185, 45, 60, 15, WS_TABSTOP } /* Dialog `Copy' */ DIALOG_COPY DIALOG 0, 0, 250, 65 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "¸´ÖƳÌÐò" +CAPTION "复制程序" { -LTEXT "¸´ÖƳÌÐò£º", IDIGNORE, 5, 5, 90, 15 +LTEXT "复制程序:", IDIGNORE, 5, 5, 90, 15 LTEXT "", PM_PROGRAM, 95, 5, 90, 15 -LTEXT "´Ó´Ë³ÌÐò×éÖУº", IDIGNORE, 5, 13, 90, 15 +LTEXT "从此程序组中:", IDIGNORE, 5, 13, 90, 15 LTEXT "", PM_FROM_GROUP, 95, 13, 90, 15 -LTEXT "Òƶ¯µ½³ÌÐò×飨&T£©£º", PM_TO_GROUP_TXT, 5, 28, 140, 15 +LTEXT "移动到程序组(&T):", PM_TO_GROUP_TXT, 5, 28, 140, 15 COMBOBOX PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST -DEFPUSHBUTTON "È·¶¨", IDOK, 185, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 185, 45, 60, 15, WS_TABSTOP +DEFPUSHBUTTON "确定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 185, 45, 60, 15, WS_TABSTOP } /* Dialog `Group attributes' */ DIALOG_GROUP DIALOG 0, 0, 230, 65 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "³ÌÐò×éÊôÐÔ" +CAPTION "程序组属性" { -LTEXT "ÃèÊö£¨&D£©£º", PM_DESCRIPTION_TXT, 05, 18, 50, 10 +LTEXT "描述(&D):", PM_DESCRIPTION_TXT, 05, 18, 50, 10 EDITTEXT PM_DESCRIPTION, 60, 18, 90, 15, WS_TABSTOP -LTEXT "×éÎļþ£¨&G£©£º", PM_FILE_TXT, 05, 38, 50, 10 +LTEXT "组文件(&G):", PM_FILE_TXT, 05, 38, 50, 10 EDITTEXT PM_FILE, 60, 38, 90, 15, WS_TABSTOP -DEFPUSHBUTTON "È·¶¨", IDOK, 155, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 155, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 155, 45, 60, 15, WS_TABSTOP +DEFPUSHBUTTON "确定", IDOK, 155, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 155, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 155, 45, 60, 15, WS_TABSTOP } /* Dialog `Program attributes' */ DIALOG_PROGRAM DIALOG 0, 0, 250, 105 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "³ÌÐòÊôÐÔ" +CAPTION "程序属性" { -LTEXT "ÃèÊö£¨&D£©£º", PM_DESCRIPTION_TXT, 05, 10, 60, 10 +LTEXT "描述(&D):", PM_DESCRIPTION_TXT, 05, 10, 60, 10 EDITTEXT PM_DESCRIPTION, 80, 10, 90, 15, WS_TABSTOP -LTEXT "ÃüÁîÐУ¨&C£©£º", PM_COMMAND_LINE_TXT, 05, 25, 60, 10 +LTEXT "命令行(&C):", PM_COMMAND_LINE_TXT, 05, 25, 60, 10 EDITTEXT PM_COMMAND_LINE, 80, 25, 90, 15, WS_TABSTOP -LTEXT "¹¤×÷Ŀ¼£¨&W£©£º", PM_DIRECTORY_TXT, 05, 40, 60, 10 +LTEXT "工作目录(&W):", PM_DIRECTORY_TXT, 05, 40, 60, 10 EDITTEXT PM_DIRECTORY, 80, 40, 90, 15, WS_TABSTOP -LTEXT "¿ì½Ý¼ü£¨&K£©£º", PM_HOT_KEY_TXT, 05, 55, 60, 10 +LTEXT "快捷键(&K):", PM_HOT_KEY_TXT, 05, 55, 60, 10 EDITTEXT PM_HOT_KEY, 80, 55, 90, 15, WS_TABSTOP ICON "", PM_ICON, 20, 70 CHECKBOX "", PM_SYMBOL, 80, 75, 10, 10, WS_TABSTOP -LTEXT "Æô¶¯ºó×îС»¯£¨&M£©", IDIGNORE, 95, 75, 75, 10 -DEFPUSHBUTTON "È·¶¨", IDOK, 185, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "ä¯ÀÀ£¨&B£©...", PM_BROWSE, 185, 45, 60, 15, WS_TABSTOP -PUSHBUTTON "ÐÞ¸Äͼ±ê£¨&I£©...", PM_OTHER_SYMBOL, 185, 65, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 185, 85, 60, 15, WS_TABSTOP +LTEXT "启动后最小化(&M)", IDIGNORE, 95, 75, 75, 10 +DEFPUSHBUTTON "确定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "浏览(&B)...", PM_BROWSE, 185, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "修改图标(&I)...", PM_OTHER_SYMBOL, 185, 65, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 185, 85, 60, 15, WS_TABSTOP } /* Dialog `Symbol' */ DIALOG_SYMBOL DIALOG 0, 0, 200, 85 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÐÞ¸Äͼ±ê" +CAPTION "修改图标" { -LTEXT "ÎļþÃû£¨&F£©£º", PM_ICON_FILE_TXT, 5, 15, 40, 10 +LTEXT "文件名(&F):", PM_ICON_FILE_TXT, 5, 15, 40, 10 EDITTEXT PM_ICON_FILE, 45, 15, 85, 15, WS_TABSTOP -LTEXT "µ±Ç°Í¼±ê£¨&I£©£º", PM_SYMBOL_LIST_TXT, 5, 30, 125, 10 +LTEXT "当前图标(&I):", PM_SYMBOL_LIST_TXT, 5, 30, 125, 10 COMBOBOX PM_SYMBOL_LIST, 5, 40, 125, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_OWNERDRAWFIXED | WS_TABSTOP -DEFPUSHBUTTON "È·¶¨", IDOK, 135, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "ä¯ÀÀ£¨&B£©...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 135, 65, 60, 15, WS_TABSTOP +DEFPUSHBUTTON "确定", IDOK, 135, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "浏览(&B)...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 135, 65, 60, 15, WS_TABSTOP } /* Dialog `Execute' */ DIALOG_EXECUTE DIALOG 0, 0, 200, 85 -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ö´ÐгÌÐò" +CAPTION "执行程序" { -LTEXT "ÃüÁîÐУ¨&C£©£º", IDIGNORE, 05, 15, 120, 10 +LTEXT "命令行(&C):", IDIGNORE, 05, 15, 120, 10 EDITTEXT PM_COMMAND, 05, 25, 120, 15, WS_TABSTOP CHECKBOX "", PM_SYMBOL, 05, 45, 10, 10, WS_TABSTOP -LTEXT "Æô¶¯ºó×îС»¯£¨&M£©", IDIGNORE, 20, 45, 120, 10 -DEFPUSHBUTTON "È·¶¨", IDOK, 135, 5, 60, 15, WS_TABSTOP -PUSHBUTTON "È¡Ïû", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP -PUSHBUTTON "ä¯ÀÀ£¨&B£©...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP -PUSHBUTTON "°ïÖú£¨&H£©", PM_HELP, 135, 65, 60, 15, WS_TABSTOP +LTEXT "启动后最小化(&M)", IDIGNORE, 20, 45, 120, 10 +DEFPUSHBUTTON "确定", IDOK, 135, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "浏览(&B)...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "帮助(&H)", PM_HELP, 135, 65, 60, 15, WS_TABSTOP +} + +/* Strings */ + +STRINGTABLE DISCARDABLE +{ +IDS_PROGRAM_MANAGER, "程序管理器" +IDS_ERROR, "错误" +IDS_WARNING, "警告" +IDS_INFO, "信息" +IDS_DELETE, "删除" +IDS_DELETE_GROUP_s, "是否删除程序组 `%s' ?" +IDS_DELETE_PROGRAM_s, "是否删除程序组 `%s' ?" +IDS_NOT_IMPLEMENTED, "此功能未实现" +IDS_FILE_READ_ERROR_s, "读取文件 %s 时发生错误。" +IDS_FILE_WRITE_ERROR_s, "写入文件 %s 时发生错误。" +IDS_GRPFILE_READ_ERROR_s, "不能打开组文件 `%s' 。\n是否继续尝试?" +IDS_OUT_OF_MEMORY, "内存溢出。" +IDS_WINHELP_ERROR, "没有可用的帮助信息。" +IDS_UNKNOWN_FEATURE_s, "在 %s 中发现未知特性" +IDS_FILE_NOT_OVERWRITTEN_s, "文件 %s 已经存在。不覆盖已有文件。" +IDS_SAVE_GROUP_AS_s, "将程序组保存为 %s 可以避免复盖已有的文件。" +IDS_NO_HOT_KEY, "未定义" +IDS_ALL_FILES, "所有文件 (*.*)" +IDS_PROGRAMS, "程序" +IDS_LIBRARIES_DLL, "动态连接库 (*.dll)" +IDS_SYMBOL_FILES, "图标文件" +IDS_SYMBOLS_ICO, "图标 (*.ico)" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +/* Menu */ + +MAIN_MENU MENU +{ + POPUP "檔案(&F)" { + MENUITEM "新建(&N)...", PM_NEW + MENUITEM "開啟(&O)\tEnter", PM_OPEN + MENUITEM "移動(&M)...\tF7", PM_MOVE, GRAYED + MENUITEM "複製(&C)...\tF8", PM_COPY, GRAYED + MENUITEM "刪除(&D)\tEntf", PM_DELETE + MENUITEM "屬性(&A)...\tAlt+Enter", PM_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "執行(&E)...", PM_EXECUTE + MENUITEM SEPARATOR + MENUITEM "結束 Windows(&X)...", PM_EXIT + } + POPUP "選項(&O)" { + MENUITEM "自動排列(&A)", PM_AUTO_ARRANGE + MENUITEM "執行時最小化(&M)", PM_MIN_ON_RUN + MENUITEM "結束時儲存設定(&S)", PM_SAVE_SETTINGS + } + POPUP "窗口(&W)" { + MENUITEM "層疊(&O)\tShift+F5", PM_OVERLAP + MENUITEM "並排(&S)\tShift+F4", PM_SIDE_BY_SIDE + MENUITEM "排列圖標(&A)", PM_ARRANGE + } + +POPUP "幫助(&H)" { + MENUITEM "內容(&C)", PM_CONTENTS + MENUITEM "搜索(&S)...", PM_SEARCH + MENUITEM SEPARATOR + MENUITEM "如何使用幫助(&H)", PM_HELPONHELP + MENUITEM "教程(&T)", PM_TUTORIAL + MENUITEM SEPARATOR + + POPUP "資料資訊(&I)..." { + MENUITEM "用戶許可協議(&L)", PM_LICENSE + MENUITEM "責任無關(&N)", PM_NO_WARRANTY + MENUITEM "關於 Wine(&A)", PM_ABOUT_WINE + } + } +} + +/* Dialog `New' */ + +DIALOG_NEW DIALOG 0, 0, 170, 65 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "新建" +{ +RADIOBUTTON "", PM_NEW_GROUP, 10, 15, 10, 15 +LTEXT "程式組(&G)", PM_NEW_GROUP, 20, 18, 80, 15 +RADIOBUTTON "", PM_NEW_PROGRAM, 10, 35, 10, 15 +LTEXT "程式(&P)", PM_NEW_PROGRAM, 20, 38, 80, 15 +DEFPUSHBUTTON "確定", IDOK, 105, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 105, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 105, 45, 60, 15, WS_TABSTOP +} + +/* Dialog `Move' */ + +DIALOG_MOVE DIALOG 0, 0, 250, 65 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "移動程式" +{ +LTEXT "移動程式:", IDIGNORE, 5, 5, 90, 15 +LTEXT "", PM_PROGRAM, 95, 5, 90, 15 +LTEXT "從此程式組中:", IDIGNORE, 5, 13, 90, 15 +LTEXT "", PM_FROM_GROUP, 95, 13, 90, 15 +LTEXT "移動到程式組(&T):", PM_TO_GROUP_TXT, 5, 28, 140, 15 +COMBOBOX PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST +DEFPUSHBUTTON "確定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 185, 45, 60, 15, WS_TABSTOP +} + +/* Dialog `Copy' */ + +DIALOG_COPY DIALOG 0, 0, 250, 65 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "複製程式" +{ +LTEXT "複製程式:", IDIGNORE, 5, 5, 90, 15 +LTEXT "", PM_PROGRAM, 95, 5, 90, 15 +LTEXT "從此程式組中:", IDIGNORE, 5, 13, 90, 15 +LTEXT "", PM_FROM_GROUP, 95, 13, 90, 15 +LTEXT "移動到程式組(&T):", PM_TO_GROUP_TXT, 5, 28, 140, 15 +COMBOBOX PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST +DEFPUSHBUTTON "確定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 185, 45, 60, 15, WS_TABSTOP +} + +/* Dialog `Group attributes' */ + +DIALOG_GROUP DIALOG 0, 0, 230, 65 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "程式組屬性" +{ +LTEXT "描述(&D):", PM_DESCRIPTION_TXT, 05, 18, 50, 10 +EDITTEXT PM_DESCRIPTION, 60, 18, 90, 15, WS_TABSTOP +LTEXT "組檔案(&G):", PM_FILE_TXT, 05, 38, 50, 10 +EDITTEXT PM_FILE, 60, 38, 90, 15, WS_TABSTOP +DEFPUSHBUTTON "確定", IDOK, 155, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 155, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 155, 45, 60, 15, WS_TABSTOP +} + +/* Dialog `Program attributes' */ + +DIALOG_PROGRAM DIALOG 0, 0, 250, 105 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "程式屬性" +{ +LTEXT "描述(&D):", PM_DESCRIPTION_TXT, 05, 10, 60, 10 +EDITTEXT PM_DESCRIPTION, 80, 10, 90, 15, WS_TABSTOP +LTEXT "指令行(&C):", PM_COMMAND_LINE_TXT, 05, 25, 60, 10 +EDITTEXT PM_COMMAND_LINE, 80, 25, 90, 15, WS_TABSTOP +LTEXT "工作目錄(&W):", PM_DIRECTORY_TXT, 05, 40, 60, 10 +EDITTEXT PM_DIRECTORY, 80, 40, 90, 15, WS_TABSTOP +LTEXT "快捷鍵(&K):", PM_HOT_KEY_TXT, 05, 55, 60, 10 +EDITTEXT PM_HOT_KEY, 80, 55, 90, 15, WS_TABSTOP +ICON "", PM_ICON, 20, 70 +CHECKBOX "", PM_SYMBOL, 80, 75, 10, 10, WS_TABSTOP +LTEXT "啟動後最小化(&M)", IDIGNORE, 95, 75, 75, 10 +DEFPUSHBUTTON "確定", IDOK, 185, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 185, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "瀏覽(&B)...", PM_BROWSE, 185, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "修改圖標(&I)...", PM_OTHER_SYMBOL, 185, 65, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 185, 85, 60, 15, WS_TABSTOP +} + +/* Dialog `Symbol' */ + +DIALOG_SYMBOL DIALOG 0, 0, 200, 85 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "修改圖標" +{ +LTEXT "檔案名(&F):", PM_ICON_FILE_TXT, 5, 15, 40, 10 +EDITTEXT PM_ICON_FILE, 45, 15, 85, 15, WS_TABSTOP +LTEXT "當前圖標(&I):", PM_SYMBOL_LIST_TXT, 5, 30, 125, 10 +COMBOBOX PM_SYMBOL_LIST, 5, 40, 125, 50, + CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_OWNERDRAWFIXED | WS_TABSTOP +DEFPUSHBUTTON "確定", IDOK, 135, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "瀏覽(&B)...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 135, 65, 60, 15, WS_TABSTOP +} + +/* Dialog `Execute' */ + +DIALOG_EXECUTE DIALOG 0, 0, 200, 85 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "執行程式" +{ +LTEXT "指令行(&C):", IDIGNORE, 05, 15, 120, 10 +EDITTEXT PM_COMMAND, 05, 25, 120, 15, WS_TABSTOP +CHECKBOX "", PM_SYMBOL, 05, 45, 10, 10, WS_TABSTOP +LTEXT "啟動後最小化(&M)", IDIGNORE, 20, 45, 120, 10 +DEFPUSHBUTTON "確定", IDOK, 135, 5, 60, 15, WS_TABSTOP +PUSHBUTTON "取消", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP +PUSHBUTTON "瀏覽(&B)...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP +PUSHBUTTON "幫助(&H)", PM_HELP, 135, 65, 60, 15, WS_TABSTOP } /* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ -IDS_PROGRAM_MANAGER, "³ÌÐò¹ÜÀíÆ÷" -IDS_ERROR, "´íÎó" -IDS_WARNING, "¾¯¸æ" -IDS_INFO, "ÐÅÏ¢" -IDS_DELETE, "ɾ³ý" -IDS_DELETE_GROUP_s, "ÊÇ·ñɾ³ý³ÌÐò×é `%s' £¿" -IDS_DELETE_PROGRAM_s, "ÊÇ·ñɾ³ý³ÌÐò×é `%s' ?" -IDS_NOT_IMPLEMENTED, "´Ë¹¦ÄÜδʵÏÖ" -IDS_FILE_READ_ERROR_s, "¶ÁÈ¡Îļþ %s ʱ·¢Éú´íÎó¡£" -IDS_FILE_WRITE_ERROR_s, "дÈëÎļþ %s ʱ·¢Éú´íÎó¡£" -IDS_GRPFILE_READ_ERROR_s, "\ -²»ÄÜ´ò¿ª×éÎļþ `%s' ¡£\n\ -ÊÇ·ñ¼ÌÐø³¢ÊÔ£¿" -IDS_OUT_OF_MEMORY, "ÄÚ´æÒç³ö¡£" -IDS_WINHELP_ERROR, "ûÓпÉÓõİïÖúÐÅÏ¢¡£" -IDS_UNKNOWN_FEATURE_s, "ÔÚ %s Öз¢ÏÖδ֪ÌØÐÔ" -IDS_FILE_NOT_OVERWRITTEN_s, "Îļþ %s ÒѾ­´æÔÚ¡£²»¸²¸ÇÒÑÓÐÎļþ¡£" -IDS_SAVE_GROUP_AS_s, "½«³ÌÐò×é±£´æΪ %s ¿ÉÒÔ±ÜÃ⸴¸ÇÒÑÓеÄÎļþ¡£" -IDS_NO_HOT_KEY, "䶨Òå" -IDS_ALL_FILES, "ËùÓÐÎļþ (*.*)" -IDS_PROGRAMS, "³ÌÐò" -IDS_LIBRARIES_DLL, "¶¯Ì¬Á¬½Ó¿â (*.dll)" -IDS_SYMBOL_FILES, "ͼ±êÎļþ" -IDS_SYMBOLS_ICO, "ͼ±ê (*.ico)" +STRINGTABLE DISCARDABLE +{ +IDS_PROGRAM_MANAGER, "程式管理器" +IDS_ERROR, "錯誤" +IDS_WARNING, "警告" +IDS_INFO, "資訊" +IDS_DELETE, "刪除" +IDS_DELETE_GROUP_s, "是否刪除程式組 `%s' ?" +IDS_DELETE_PROGRAM_s, "是否刪除程式組 `%s' ?" +IDS_NOT_IMPLEMENTED, "此功能未實現" +IDS_FILE_READ_ERROR_s, "讀取檔案 %s 時發生錯誤。" +IDS_FILE_WRITE_ERROR_s, "寫入檔案 %s 時發生錯誤。" +IDS_GRPFILE_READ_ERROR_s, "不能開啟組檔案 `%s' 。\n是否繼續嘗試?" +IDS_OUT_OF_MEMORY, "內存溢出。" +IDS_WINHELP_ERROR, "沒有可用的幫助資訊。" +IDS_UNKNOWN_FEATURE_s, "在 %s 中發現未知特性" +IDS_FILE_NOT_OVERWRITTEN_s, "檔案 %s 已經存在。不覆蓋已有檔案。" +IDS_SAVE_GROUP_AS_s, "將程式組儲存為 %s 可以避免復蓋已有的檔案。" +IDS_NO_HOT_KEY, "未定義" +IDS_ALL_FILES, "所有檔案 (*.*)" +IDS_PROGRAMS, "程式" +IDS_LIBRARIES_DLL, "動態連接庫 (*.dll)" +IDS_SYMBOL_FILES, "圖標檔案" +IDS_SYMBOLS_ICO, "圖標 (*.ico)" } + +#pragma code_page(default) diff --git a/programs/regedit/childwnd.c b/programs/regedit/childwnd.c index 76f354dd5e4..565c90d4bef 100644 --- a/programs/regedit/childwnd.c +++ b/programs/regedit/childwnd.c @@ -215,6 +215,7 @@ LPWSTR GetItemFullPathW(HWND hwndTV, HTREEITEM hItem, BOOL bFull) { parts[1] = GetItemPathW(hwndTV, hItem, &hRootKey); ret = CombinePathsW((LPCWSTR *)parts, 2); HeapFree(GetProcessHeap(), 0, parts[0]); + HeapFree(GetProcessHeap(), 0, parts[1]); return ret; } @@ -232,10 +233,11 @@ static LPTSTR GetPathFullPath(HWND hwndTV, LPTSTR path) { static void OnTreeSelectionChanged(HWND hwndTV, HWND hwndLV, HTREEITEM hItem, BOOL bRefreshLV) { if (bRefreshLV) { - LPCTSTR keyPath; + LPWSTR keyPath; HKEY hRootKey = NULL; - keyPath = GetItemPath(hwndTV, hItem, &hRootKey); + keyPath = GetItemPathW(hwndTV, hItem, &hRootKey); RefreshListView(hwndLV, hRootKey, keyPath, NULL); + HeapFree(GetProcessHeap(), 0, keyPath); } UpdateStatusBar(); } diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index 1c26baa5ad4..4e4c1ed751b 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -449,27 +449,27 @@ done: return result; } -BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType, LPTSTR valueName) +BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, DWORD valueType, LPWSTR valueName) { LONG lRet = ERROR_SUCCESS; - TCHAR newValue[256]; + WCHAR newValue[256]; DWORD valueDword = 0; BOOL result = FALSE; int valueNum; HKEY hKey; - lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); return FALSE; } - if (!LoadString(GetModuleHandle(0), IDS_NEWVALUE, newValue, COUNT_OF(newValue))) goto done; + if (!LoadStringW(GetModuleHandle(0), IDS_NEWVALUE, newValue, COUNT_OF(newValue))) goto done; /* try to find out a name for the newly create key (max 100 times) */ for (valueNum = 1; valueNum < 100; valueNum++) { - wsprintf(valueName, newValue, valueNum); - lRet = RegQueryValueEx(hKey, valueName, 0, 0, 0, 0); + wsprintfW(valueName, newValue, valueNum); + lRet = RegQueryValueExW(hKey, valueName, 0, 0, 0, 0); if (lRet == ERROR_FILE_NOT_FOUND) break; } if (lRet != ERROR_FILE_NOT_FOUND) { @@ -477,7 +477,7 @@ BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType, LPT goto done; } - lRet = RegSetValueEx(hKey, valueName, 0, valueType, (BYTE*)&valueDword, sizeof(DWORD)); + lRet = RegSetValueExW(hKey, valueName, 0, valueType, (BYTE*)&valueDword, sizeof(DWORD)); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c index 1a9182662b9..2053f70278f 100644 --- a/programs/regedit/framewnd.c +++ b/programs/regedit/framewnd.c @@ -31,6 +31,7 @@ #include "main.h" #include "regproc.h" +#include "wine/unicode.h" /******************************************************************************** * Global and Local Variables: @@ -82,12 +83,13 @@ static void resize_frame_client(HWND hWnd) static void OnEnterMenuLoop(HWND hWnd) { int nParts; + WCHAR empty = 0; /* Update the status bar pane sizes */ nParts = -1; - SendMessage(hStatusBar, SB_SETPARTS, 1, (long)&nParts); + SendMessageW(hStatusBar, SB_SETPARTS, 1, (long)&nParts); bInMenuLoop = TRUE; - SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T("")); + SendMessageW(hStatusBar, SB_SETTEXTW, (WPARAM)0, (LPARAM)&empty); } static void OnExitMenuLoop(HWND hWnd) @@ -102,8 +104,8 @@ static void UpdateMenuItems(HMENU hMenu) { HWND hwndTV = g_pChildWnd->hTreeWnd; BOOL bAllowEdit = FALSE; HKEY hRootKey = NULL; - LPCTSTR keyName; - keyName = GetItemPath(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey); + LPWSTR keyName; + keyName = GetItemPathW(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey); if (GetFocus() != hwndTV || (keyName && *keyName)) { /* can't modify root keys, but allow for their values */ bAllowEdit = TRUE; } @@ -115,6 +117,8 @@ static void UpdateMenuItems(HMENU hMenu) { EnableMenuItem(hMenu, ID_FAVORITES_ADDTOFAVORITES, (hRootKey ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND); EnableMenuItem(hMenu, ID_FAVORITES_REMOVEFAVORITE, (GetMenuItemCount(hMenu)>2 ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND); + + HeapFree(GetProcessHeap(), 0, keyName); } static void OnInitMenuPopup(HWND hWnd, HMENU hMenu, short wItem) @@ -154,23 +158,23 @@ static void OnInitMenuPopup(HWND hWnd, HMENU hMenu, short wItem) static void OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu) { - TCHAR str[100]; + WCHAR str[100]; - _tcscpy(str, _T("")); + str[0] = 0; if (nFlags & MF_POPUP) { if (hSysMenu != GetMenu(hWnd)) { if (nItemID == 2) nItemID = 5; } } - if (LoadString(hInst, nItemID, str, 100)) { + if (LoadStringW(hInst, nItemID, str, 100)) { /* load appropriate string*/ - LPTSTR lpsz = str; + LPWSTR lpsz = str; /* first newline terminates actual string*/ - lpsz = _tcschr(lpsz, '\n'); + lpsz = strchrW(lpsz, '\n'); if (lpsz != NULL) *lpsz = '\0'; } - SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)str); + SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)str); } void SetupStatusBar(HWND hWnd, BOOL bResize) @@ -181,15 +185,15 @@ void SetupStatusBar(HWND hWnd, BOOL bResize) nParts = rc.right; /* nParts = -1;*/ if (bResize) - SendMessage(hStatusBar, WM_SIZE, 0, 0); - SendMessage(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts); + SendMessageW(hStatusBar, WM_SIZE, 0, 0); + SendMessageW(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts); UpdateStatusBar(); } void UpdateStatusBar(void) { - LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, TRUE); - SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath); + LPWSTR fullPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, TRUE); + SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } @@ -632,15 +636,11 @@ static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM w static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HKEY hKeyRoot = 0; - LPCTSTR keyPath; LPCTSTR valueName; - TCHAR newKey[MAX_NEW_KEY_LEN]; DWORD valueType; int curIndex; BOOL firstItem = TRUE; - keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); - if (LOWORD(wParam) >= ID_FAVORITE_FIRST && LOWORD(wParam) <= ID_FAVORITE_LAST) { HKEY hKey; if (RegOpenKeyExW(HKEY_CURRENT_USER, favoritesKey, @@ -679,18 +679,18 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case ID_EDIT_DELETE: if (GetFocus() == g_pChildWnd->hTreeWnd) { - WCHAR* keyPathW = GetWideString(keyPath); + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); if (keyPath == 0 || *keyPath == 0) { - MessageBeep(MB_ICONHAND); - } else if (DeleteKey(hWnd, hKeyRoot, keyPathW)) { + MessageBeep(MB_ICONHAND); + } else if (DeleteKey(hWnd, hKeyRoot, keyPath)) { DeleteNode(g_pChildWnd->hTreeWnd, 0); } - HeapFree(GetProcessHeap(), 0, keyPathW); + HeapFree(GetProcessHeap(), 0, keyPath); } else if (GetFocus() == g_pChildWnd->hListWnd) { + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED); while(curIndex != -1) { WCHAR* valueNameW; - WCHAR* keyPathW; valueName = GetItemText(g_pChildWnd->hListWnd, curIndex); curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED); @@ -701,25 +701,31 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; } valueNameW = GetWideString(valueName); - keyPathW = GetWideString(keyPath); - if (!DeleteValue(hWnd, hKeyRoot, keyPathW, valueNameW, curIndex==-1 && firstItem)) + if (!DeleteValue(hWnd, hKeyRoot, keyPath, valueNameW, curIndex==-1 && firstItem)) { HeapFree(GetProcessHeap(), 0, valueNameW); - HeapFree(GetProcessHeap(), 0, keyPathW); break; } firstItem = FALSE; HeapFree(GetProcessHeap(), 0, valueNameW); - HeapFree(GetProcessHeap(), 0, keyPathW); } - RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); + HeapFree(GetProcessHeap(), 0, keyPath); } break; case ID_EDIT_MODIFY: - valueName = GetValueName(g_pChildWnd->hListWnd); - if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName)) - RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName); + { + LPCWSTR valueNameW = GetValueName(g_pChildWnd->hListWnd); + CHAR* valueNameA = GetMultiByteString(valueNameW); + WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + CHAR* keyPathA = GetMultiByteString(keyPathW); + if (ModifyValue(hWnd, hKeyRoot, keyPathA, valueNameA)) + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, valueNameW); + HeapFree(GetProcessHeap(), 0, valueNameA); + HeapFree(GetProcessHeap(), 0, keyPathW); + HeapFree(GetProcessHeap(), 0, keyPathA); break; + } case ID_EDIT_FIND: case ID_EDIT_FINDNEXT: { @@ -766,12 +772,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_NEW_KEY: { WCHAR newKeyW[MAX_NEW_KEY_LEN]; - WCHAR* keyPathW = GetWideString(keyPath); - if (CreateKey(hWnd, hKeyRoot, keyPathW, newKeyW)) { + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + if (CreateKey(hWnd, hKeyRoot, keyPath, newKeyW)) { if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKeyW)) StartKeyRename(g_pChildWnd->hTreeWnd); } - HeapFree(GetProcessHeap(), 0, keyPathW); + HeapFree(GetProcessHeap(), 0, keyPath); } break; case ID_EDIT_NEW_STRINGVALUE: @@ -787,20 +793,29 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) valueType = REG_DWORD; /* fall through */ create_value: - if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) { - RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey); + { + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR newKey[MAX_NEW_KEY_LEN]; + if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) { + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey); StartValueRename(g_pChildWnd->hListWnd); - /* FIXME: start rename */ - } + /* FIXME: start rename */ + } + HeapFree(GetProcessHeap(), 0, keyPath); + } break; case ID_EDIT_RENAME: - if (keyPath == 0 || *keyPath == 0) { - MessageBeep(MB_ICONHAND); - } else if (GetFocus() == g_pChildWnd->hTreeWnd) { - StartKeyRename(g_pChildWnd->hTreeWnd); - } else if (GetFocus() == g_pChildWnd->hListWnd) { - StartValueRename(g_pChildWnd->hListWnd); - } + { + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + if (keyPath == 0 || *keyPath == 0) { + MessageBeep(MB_ICONHAND); + } else if (GetFocus() == g_pChildWnd->hTreeWnd) { + StartKeyRename(g_pChildWnd->hTreeWnd); + } else if (GetFocus() == g_pChildWnd->hListWnd) { + StartValueRename(g_pChildWnd->hListWnd); + } + HeapFree(GetProcessHeap(), 0, keyPath); + } break; case ID_REGISTRY_PRINTERSETUP: /*PRINTDLG pd;*/ @@ -843,8 +858,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; } case ID_VIEW_REFRESH: + { + WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); RefreshTreeView(g_pChildWnd->hTreeWnd); RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); + HeapFree(GetProcessHeap(), 0, keyPath); + } break; /*case ID_OPTIONS_TOOLBAR:*/ /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/ diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c index ebb456a1d1c..0a919a0fd80 100644 --- a/programs/regedit/listview.c +++ b/programs/regedit/listview.c @@ -25,6 +25,7 @@ #include #include "main.h" +#include "regproc.h" #include "wine/unicode.h" static INT Image_String; @@ -33,7 +34,7 @@ static INT Image_Binary; typedef struct tagLINE_INFO { DWORD dwValType; - LPTSTR name; + LPWSTR name; void* val; size_t val_len; } LINE_INFO; @@ -45,9 +46,10 @@ typedef struct tagLINE_INFO static WNDPROC g_orgListWndProc; static DWORD g_columnToSort = ~0U; static BOOL g_invertSort = FALSE; -static LPTSTR g_valueName; -static LPTSTR g_currentPath; +static LPWSTR g_valueName; +static LPWSTR g_currentPath; static HKEY g_currentRootKey; +static WCHAR g_szValueNotSetW[64]; static TCHAR g_szValueNotSet[64]; #define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1) @@ -77,24 +79,47 @@ LPTSTR GetItemText(HWND hwndLV, UINT item) return NULL; } -LPCTSTR GetValueName(HWND hwndLV) +LPWSTR GetItemTextW(HWND hwndLV, UINT item) +{ + LPWSTR newStr, curStr; + unsigned int maxLen = 128; + + curStr = HeapAlloc(GetProcessHeap(), 0, maxLen * sizeof(WCHAR)); + if (!curStr) return NULL; + if (item == 0) { /* first item is ALWAYS a default */ + HeapFree(GetProcessHeap(), 0, curStr); + return NULL; + } + do { + ListView_GetItemTextW(hwndLV, item, 0, curStr, maxLen * sizeof(WCHAR)); + if (lstrlenW(curStr) < maxLen - 1) return curStr; + newStr = HeapReAlloc(GetProcessHeap(), 0, curStr, maxLen * 2 * sizeof(WCHAR)); + if (!newStr) break; + curStr = newStr; + maxLen *= 2; + } while (TRUE); + HeapFree(GetProcessHeap(), 0, curStr); + return NULL; +} + +LPCWSTR GetValueName(HWND hwndLV) { INT item; - if (g_valueName != LPSTR_TEXTCALLBACK) + if (g_valueName != LPSTR_TEXTCALLBACKW) HeapFree(GetProcessHeap(), 0, g_valueName); g_valueName = NULL; item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED); if (item == -1) return NULL; - g_valueName = GetItemText(hwndLV, item); + g_valueName = GetItemTextW(hwndLV, item); return g_valueName; } /* convert '\0' separated string list into ',' separated string list */ -static void MakeMULTISZDisplayable(LPTSTR multi) +static void MakeMULTISZDisplayable(LPWSTR multi) { do { @@ -111,30 +136,34 @@ static void MakeMULTISZDisplayable(LPTSTR multi) /******************************************************************************* * Local module support methods */ -static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, +static void AddEntryToList(HWND hwndLV, LPWSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount, BOOL bHighlight) { LINE_INFO* linfo; - LVITEM item; + LVITEMW item; int index; linfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LINE_INFO) + dwCount); linfo->dwValType = dwValType; linfo->val_len = dwCount; - memcpy(&linfo[1], ValBuf, dwCount); + CopyMemory(&linfo[1], ValBuf, dwCount); if (Name) - linfo->name = _tcsdup(Name); - else + { + linfo->name = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(Name) + 1) * sizeof(WCHAR)); + lstrcpyW(linfo->name, Name); + } else + { linfo->name = NULL; + } item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; item.iItem = ListView_GetItemCount(hwndLV);/*idx; */ item.iSubItem = 0; item.state = 0; item.stateMask = LVIS_FOCUSED | LVIS_SELECTED; - item.pszText = Name ? Name : LPSTR_TEXTCALLBACK; - item.cchTextMax = Name ? _tcslen(item.pszText) : 0; + item.pszText = Name ? Name : LPSTR_TEXTCALLBACKW; + item.cchTextMax = Name ? lstrlenW(item.pszText) : 0; if (bHighlight) { item.stateMask = item.state = LVIS_FOCUSED | LVIS_SELECTED; } @@ -155,43 +184,45 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, item.iIndent = 0; #endif - index = ListView_InsertItem(hwndLV, &item); + index = ListView_InsertItemW(hwndLV, &item); if (index != -1) { switch (dwValType) { case REG_SZ: case REG_EXPAND_SZ: if (ValBuf) { - ListView_SetItemText(hwndLV, index, 2, ValBuf); + ListView_SetItemTextW(hwndLV, index, 2, ValBuf); } else { - ListView_SetItemText(hwndLV, index, 2, g_szValueNotSet); + ListView_SetItemTextW(hwndLV, index, 2, g_szValueNotSetW); } break; case REG_DWORD: { - TCHAR buf[64]; - wsprintf(buf, _T("0x%08x (%u)"), *(DWORD*)ValBuf, *(DWORD*)ValBuf); - ListView_SetItemText(hwndLV, index, 2, buf); + WCHAR buf[64]; + WCHAR format[] = {'0','x','%','0','8','x',' ','(','%','u',')',0}; + wsprintfW(buf, format, *(DWORD*)ValBuf, *(DWORD*)ValBuf); + ListView_SetItemTextW(hwndLV, index, 2, buf); } break; case REG_BINARY: { unsigned int i; LPBYTE pData = (LPBYTE)ValBuf; - LPTSTR strBinary = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(TCHAR) * 3 + 1); + LPWSTR strBinary = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(WCHAR) * 3 + sizeof(WCHAR)); + WCHAR format[] = {'%','0','2','X',' ',0}; for (i = 0; i < dwCount; i++) - wsprintf( strBinary + i*3, _T("%02X "), pData[i] ); + wsprintfW( strBinary + i*3, format, pData[i] ); strBinary[dwCount * 3] = 0; - ListView_SetItemText(hwndLV, index, 2, strBinary); + ListView_SetItemTextW(hwndLV, index, 2, strBinary); HeapFree(GetProcessHeap(), 0, strBinary); } break; case REG_MULTI_SZ: MakeMULTISZDisplayable(ValBuf); - ListView_SetItemText(hwndLV, index, 2, ValBuf); + ListView_SetItemTextW(hwndLV, index, 2, ValBuf); break; default: { - TCHAR szText[128]; - LoadString(hInst, IDS_REGISTRY_VALUE_CANT_DISPLAY, szText, COUNT_OF(szText)); - ListView_SetItemText(hwndLV, index, 2, szText); + WCHAR szText[128]; + LoadStringW(hInst, IDS_REGISTRY_VALUE_CANT_DISPLAY, szText, COUNT_OF(szText)); + ListView_SetItemTextW(hwndLV, index, 2, szText); break; } } @@ -335,7 +366,7 @@ static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSor if (g_columnToSort == 2) { /* FIXME: Sort on value */ } - return g_invertSort ? _tcscmp(r->name, l->name) : _tcscmp(l->name, r->name); + return g_invertSort ? lstrcmpiW(r->name, l->name) : lstrcmpiW(l->name, r->name); } HWND StartValueRename(HWND hwndLV) @@ -392,11 +423,18 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR case LVN_ENDLABELEDIT: { LPNMLVDISPINFO dispInfo = (LPNMLVDISPINFO)lParam; LPTSTR valueName = GetItemText(hWnd, dispInfo->item.iItem); + LPSTR pathA; LONG ret; if (!valueName) return -1; /* cannot rename a default value */ - ret = RenameValue(hWnd, g_currentRootKey, g_currentPath, valueName, dispInfo->item.pszText); + pathA = GetMultiByteString(g_currentPath); + ret = RenameValue(hWnd, g_currentRootKey, pathA, valueName, dispInfo->item.pszText); + HeapFree(GetProcessHeap(), 0, pathA); if (ret) - RefreshListView(hWnd, g_currentRootKey, g_currentPath, dispInfo->item.pszText); + { + WCHAR* itemTextW = GetWideString(dispInfo->item.pszText); + RefreshListView(hWnd, g_currentRootKey, g_currentPath, itemTextW); + HeapFree(GetProcessHeap(), 0, itemTextW); + } HeapFree(GetProcessHeap(), 0, valueName); return 0; } @@ -461,6 +499,7 @@ HWND CreateListView(HWND hwndParent, UINT id) /* prepare strings */ LoadString(hInst, IDS_REGISTRY_VALUE_NOT_SET, g_szValueNotSet, COUNT_OF(g_szValueNotSet)); + LoadStringW(hInst, IDS_REGISTRY_VALUE_NOT_SET, g_szValueNotSetW, COUNT_OF(g_szValueNotSetW)); /* Get the dimensions of the parent window's client area, and create the list view control. */ GetClientRect(hwndParent, &rcClient); @@ -481,40 +520,40 @@ fail: return NULL; } -BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highlightValue) +BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue) { BOOL result = FALSE; DWORD max_sub_key_len; DWORD max_val_name_len, valNameLen; DWORD max_val_size, valSize; DWORD val_count, index, valType; - TCHAR* valName = 0; + WCHAR* valName = 0; BYTE* valBuf = 0; HKEY hKey = 0; LONG errCode; INT count, i; - LVITEM item; + LVITEMW item; if (!hwndLV) return FALSE; - SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0); + SendMessageW(hwndLV, WM_SETREDRAW, FALSE, 0); - errCode = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ, &hKey); + errCode = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ, &hKey); if (errCode != ERROR_SUCCESS) goto done; count = ListView_GetItemCount(hwndLV); for (i = 0; i < count; i++) { item.mask = LVIF_PARAM; item.iItem = i; - SendMessage( hwndLV, LVM_GETITEM, 0, (LPARAM)&item ); - free(((LINE_INFO*)item.lParam)->name); + SendMessageW( hwndLV, LVM_GETITEM, 0, (LPARAM)&item ); + HeapFree(GetProcessHeap(), 0, ((LINE_INFO*)item.lParam)->name); HeapFree(GetProcessHeap(), 0, (void*)item.lParam); } g_columnToSort = ~0U; - SendMessage( hwndLV, LVM_DELETEALLITEMS, 0, 0L ); + SendMessageW( hwndLV, LVM_DELETEALLITEMS, 0, 0L ); /* get size information and resize the buffers if necessary */ - errCode = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL, + errCode = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL, &val_count, &max_val_name_len, &max_val_size, NULL, NULL); if (errCode != ERROR_SUCCESS) goto done; @@ -522,9 +561,9 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli max_val_name_len++; max_val_size++; - valName = HeapAlloc(GetProcessHeap(), 0, max_val_name_len * sizeof(TCHAR)); + valName = HeapAlloc(GetProcessHeap(), 0, max_val_name_len * sizeof(WCHAR)); valBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size); - if (RegQueryValueEx(hKey, NULL, NULL, &valType, valBuf, &valSize) == ERROR_FILE_NOT_FOUND) { + if (RegQueryValueExW(hKey, NULL, NULL, &valType, valBuf, &valSize) == ERROR_FILE_NOT_FOUND) { AddEntryToList(hwndLV, NULL, REG_SZ, NULL, 0, !highlightValue); } for(index = 0; index < val_count; index++) { @@ -532,21 +571,21 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli valNameLen = max_val_name_len; valSize = max_val_size; valType = 0; - errCode = RegEnumValue(hKey, index, valName, &valNameLen, NULL, &valType, valBuf, &valSize); + errCode = RegEnumValueW(hKey, index, valName, &valNameLen, NULL, &valType, valBuf, &valSize); if (errCode != ERROR_SUCCESS) goto done; valBuf[valSize] = 0; - if (valName && highlightValue && !_tcscmp(valName, highlightValue)) + if (valName && highlightValue && !lstrcmpW(valName, highlightValue)) bSelected = TRUE; AddEntryToList(hwndLV, valName[0] ? valName : NULL, valType, valBuf, valSize, bSelected); } - SendMessage(hwndLV, LVM_SORTITEMS, (WPARAM)hwndLV, (LPARAM)CompareFunc); + SendMessageW(hwndLV, LVM_SORTITEMS, (WPARAM)hwndLV, (LPARAM)CompareFunc); g_currentRootKey = hKeyRoot; if (keyPath != g_currentPath) { HeapFree(GetProcessHeap(), 0, g_currentPath); - g_currentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlen(keyPath) + 1) * sizeof(TCHAR)); + g_currentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(keyPath) + 1) * sizeof(WCHAR)); if (!g_currentPath) goto done; - lstrcpy(g_currentPath, keyPath); + lstrcpyW(g_currentPath, keyPath); } result = TRUE; @@ -554,7 +593,7 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli done: HeapFree(GetProcessHeap(), 0, valBuf); HeapFree(GetProcessHeap(), 0, valName); - SendMessage(hwndLV, WM_SETREDRAW, TRUE, 0); + SendMessageW(hwndLV, WM_SETREDRAW, TRUE, 0); if (hKey) RegCloseKey(hKey); return result; diff --git a/programs/regedit/main.c b/programs/regedit/main.c index 5661b263412..3033d7dcffd 100644 --- a/programs/regedit/main.c +++ b/programs/regedit/main.c @@ -80,6 +80,7 @@ const TCHAR szChildClass[] = {'R','E','G','E','D','I','T',0}; static BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { + WCHAR empty = 0; WNDCLASSEX wcFrame = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW/*style*/, @@ -116,8 +117,8 @@ static BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) ATOM hChildWndClass = RegisterClassEx(&wcChild); /* register child windows class */ hChildWndClass = hChildWndClass; /* warning eater */ - hMenuFrame = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_REGEDIT_MENU)); - hPopupMenus = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_POPUP_MENUS)); + hMenuFrame = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_REGEDIT_MENU)); + hPopupMenus = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_POPUP_MENUS)); /* Initialize the Windows Common Controls DLL */ InitCommonControls(); @@ -140,8 +141,8 @@ static BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) } /* Create the status bar */ - hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, - _T(""), hFrameWnd, STATUS_WINDOW); + hStatusBar = CreateStatusWindowW(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, + &empty, hFrameWnd, STATUS_WINDOW); if (hStatusBar) { /* Create the status bar panes */ SetupStatusBar(hFrameWnd, FALSE); diff --git a/programs/regedit/main.h b/programs/regedit/main.h index 55f2201ee2b..aacacc68531 100644 --- a/programs/regedit/main.h +++ b/programs/regedit/main.h @@ -120,10 +120,10 @@ extern void UpdateStatusBar(void); /* listview.c */ extern HWND CreateListView(HWND hwndParent, UINT id); -extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highlightValue); +extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue); extern HWND StartValueRename(HWND hwndLV); extern LPTSTR GetItemText(HWND hwndLV, UINT item); -extern LPCTSTR GetValueName(HWND hwndLV); +extern LPCWSTR GetValueName(HWND hwndLV); extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result); extern BOOL IsDefaultValue(HWND hwndLV, int i); @@ -141,7 +141,7 @@ extern HTREEITEM FindNext(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mod /* edit.c */ extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPWSTR newKeyName); -extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType, LPTSTR valueName); +extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, DWORD valueType, LPWSTR valueName); extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName); extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath); extern BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName, BOOL showMessageBox); diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c index 8f05a2d6e45..eb724bea31d 100644 --- a/programs/regedit/regproc.c +++ b/programs/regedit/regproc.c @@ -113,28 +113,28 @@ static BOOL convertHexToDWord(WCHAR* str, DWORD *dw) /****************************************************************************** * Converts a hex comma separated values list into a binary string. */ -static BYTE* convertHexCSVToHex(WCHAR *strW, DWORD *size) +static BYTE* convertHexCSVToHex(WCHAR *str, DWORD *size) { - char *s; + WCHAR *s; BYTE *d, *data; - char* strA = GetMultiByteString(strW); /* The worst case is 1 digit + 1 comma per byte */ - *size=(strlen(strA)+1)/2; + *size=(lstrlenW(str)+1)/2; data=HeapAlloc(GetProcessHeap(), 0, *size); CHECK_ENOUGH_MEMORY(data); - s = strA; + s = str; d = data; *size=0; while (*s != '\0') { UINT wc; - char *end; + WCHAR *end; - wc = strtoul(s,&end,16); + wc = strtoulW(s,&end,16); if (end == s || wc > 0xff || (*end && *end != ',')) { + char* strA = GetMultiByteString(s); fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid value at '%s'\n", - getAppName(), s); + getAppName(), strA); HeapFree(GetProcessHeap(), 0, data); HeapFree(GetProcessHeap(), 0, strA); return NULL; @@ -145,8 +145,6 @@ static BYTE* convertHexCSVToHex(WCHAR *strW, DWORD *size) s = end; } - HeapFree(GetProcessHeap(), 0, strA); - return data; } @@ -666,13 +664,22 @@ void processRegLinesA(FILE *in) if (s_eol > line && *(s_eol-1) == '\\') { int c; s = s_eol-1; - /* The following error protection could be made more self- - * correcting but I thought it not worth trying. - */ - if ((c = fgetc (in)) == EOF || c != ' ' || - (c = fgetc (in)) == EOF || c != ' ') + + do + { + c = fgetc(in); + } while(c == ' ' || c == '\t'); + + if(c == EOF) + { fprintf(stderr,"%s: ERROR - invalid continuation.\n", getAppName()); + } + else + { + *s = c; + s++; + } continue; } diff --git a/programs/winecfg/Zh.rc b/programs/winecfg/Zh.rc dissimilarity index 62% index 816c94c898b..87cdcf1f073 100644 --- a/programs/winecfg/Zh.rc +++ b/programs/winecfg/Zh.rc @@ -1,306 +1,597 @@ -/* - * WineCfg resources - * Traditional Chinese Language Support - * - * Copyright 2008 Sin-ta Hsiea - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL - -IDR_WINECFG MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "³]©w", IDC_AUDIO_CONFIGURE - END -END - -IDD_ABOUTCFG DIALOGEX 0, 0, 260, 270 -STYLE WS_CHILD -FONT 8, "PMingLiu" -BEGIN - LTEXT PACKAGE_STRING,IDC_STATIC,119,17,120,8 - CONTROL IDB_WINE,IDC_STATIC,"Static",SS_BITMAP ,15,17,157,111 - LTEXT "http://www.winehq.org/",IDC_STATIC,119,31,106,8 - LTEXT "³o¤@¨ç¦¡®w¬O¦Û¥Ñ³nÅé¡A §A¥i¥H¿í·Ó¦Û¥Ñ³nÅé°òª÷·|¥Xª©ªº GNU ¸û¼eÃP³q¥Î¤½¦@³\\¥iÃÒ±ø´Ú ¨Ó­×§ï©M­«·sµo§G³o¤@µ{¦¡¡A ©ÎªÌ¬O³\\¥iÃÒªº2.1ª©¡A ©Î¬O (®Ú¾Ú§Aªº¿ï¾Ü) ¥ô¦ó§ó·sªºª©¥»¡C", - IDC_STATIC,119,44,124,72 - GROUPBOX " Windows Registration Information ", IDC_STATIC, 15, 110, 230, 55 - LTEXT "Owner:", IDC_STATIC, 22, 126, 40, 20 - LTEXT "Organization:", IDC_STATIC, 22, 140, 50, 20 - EDITTEXT IDC_ABT_OWNER, 75, 126, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP - EDITTEXT IDC_ABT_ORG, 75, 140, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP -END - -IDD_APPCFG DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " À³¥Îµ{¦¡³]©w ",IDC_STATIC, 8,4,244,240 - LTEXT "Wine ¥i¥H¹ï¤£¦Pµ{¦¡°²¸Ë¦¨¤£¦Pª©¥»ªº Windows ¡C ¡u¨ç¦¡®w¡v »P ¡uÅã¥Ü¡v ­¶ÅÒ±N³sµ²¨ì³o­Ó­¶ÅÒ¡A °£¤F½Õ¾ã¹w³]³]©w¡A ¤]¯à½Õ¾ã­Ó§Oµ{¦¡ªº³]©w¡C", - IDC_STATIC,15,20,227,30 - CONTROL "Applications",IDC_APP_LISTVIEW,"SysListView32",WS_BORDER | WS_TABSTOP | LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS, - 15,50,230,150 - PUSHBUTTON "¼W¥[µ{¦¡³]©w(&A)...",IDC_APP_ADDAPP, 90,204,75,14 - PUSHBUTTON "²¾°£µ{¦¡³]©w(&R)",IDC_APP_REMOVEAPP, 170,204,75,14 - LTEXT "&Windows ª©¥»¡G",IDC_STATIC,17,226,58,8 - COMBOBOX IDC_WINVER,83,224,163,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP -END - -IDD_GRAPHCFG DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " µøµ¡³]©w ",IDC_STATIC,8,4,244,84 - CONTROL "¤¹³\\ DirectX µ{¦¡¨¾¤î´å¼ÐÂ÷¶}¥¦ªºµøµ¡(&m)",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 - CONTROL "Allow the window manager to &decorate the windows",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 - CONTROL "¤¹³\\µøµ¡ºÞ²z¾¹±±¨îµøµ¡(&w)",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 - CONTROL "¼ÒÀÀ¤@­ÓµêÀÀ®à­±(&d)",IDC_ENABLE_DESKTOP,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,15,56,230,8 - LTEXT "®à­±¤j¤p(&s)¡G",IDC_DESKTOP_SIZE,15,70,44,8,WS_DISABLED - LTEXT "X",IDC_DESKTOP_BY,109,70,8,8,WS_DISABLED - EDITTEXT IDC_DESKTOP_WIDTH,64,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED - EDITTEXT IDC_DESKTOP_HEIGHT,117,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED - - GROUPBOX " Direct3D ",IDC_STATIC,8,95,244,49 - LTEXT "&Vertex Shader¤ä´©¡G",IDC_STATIC,15,110,80,32 - COMBOBOX IDC_D3D_VSHADER_MODE,100,108,145,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "¤¹³\\&Pixel Shader¡]¦pªGµwÅé¤ä´©¡^",IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 - - GROUPBOX " ¿Ã¹õ¸ÑªR«×(&R) ",IDC_STATIC,8,151,244,93 - CONTROL "", IDC_RES_TRACKBAR, "msctls_trackbar32",WS_TABSTOP,12,161,187,15 - EDITTEXT IDC_RES_DPIEDIT,204,161,23,13,ES_NUMBER|WS_TABSTOP - LTEXT "dpi",IDC_STATIC,235,163,10,8 - LTEXT "This is a sample text using 10 point Tahoma",IDC_RES_FONT_PREVIEW,15,181,230,55 -END - -IDD_DLLCFG DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " DLL ³»´À ",IDC_STATIC,8,4,244,240 - LTEXT "°ÊºA³sµ²¨ç¦¡®w¥i¥H­Ó§O³]©w¡A ¨Ó«ü©w­n¨Ï¥Î Wine ´£¨Ñªº¤º«Øª©¥»¡A ÁÙ¬O¨Ï¥Î¨ú¦Û Windows ©Îµ{¦¡©Ò´£¨Ñªº­ì¥Íª©¥»¡C" - ,IDC_STATIC,16,16,220,32 - LTEXT "·s¼W¨ç¦¡®w³»´À(&N)¡G",IDC_STATIC,16,58,100,8 - COMBOBOX IDC_DLLCOMBO,16,68,140,14,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_SORT | CBS_LOWERCASE - PUSHBUTTON "¥[¤J(&A)",IDC_DLLS_ADDDLL, 164,68,82,13,BS_DEFPUSHBUTTON - LTEXT "¤w¦³ªº¨ç¦¡®w³»´À(&o)¡G",IDC_STATIC,16,86,100,8 - LISTBOX IDC_DLLS_LIST,16,96,140,140,WS_BORDER | WS_TABSTOP | WS_VSCROLL - PUSHBUTTON "½s¿è(&E)",IDC_DLLS_EDITDLL,164,96,82,14 - PUSHBUTTON "²¾°£(&R)",IDC_DLLS_REMOVEDLL,164,114,82,14 -END - -IDD_LOADORDER DIALOG DISCARDABLE 80, 90, 110, 92 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "½s¿è³»´À" -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " ¸ü¤J¶¶§Ç ",IDC_STATIC,8,4,94,66 - CONTROL "¤º«Ø(Wine)(&B)",IDC_RAD_BUILTIN,"Button", BS_AUTORADIOBUTTON | WS_GROUP,16,14,75,10 - CONTROL "­ì¥Í(Windows)(&N)",IDC_RAD_NATIVE,"Button", BS_AUTORADIOBUTTON,16,24,75,10 - CONTROL "¤º«Ø¥ý©ó­ì¥Í(&l)",IDC_RAD_BUILTIN_NATIVE,"Button", BS_AUTORADIOBUTTON,16,34,75,10 - CONTROL "­ì¥Í¥ý©ó¤º«Ø(&v)",IDC_RAD_NATIVE_BUILTIN,"Button", BS_AUTORADIOBUTTON,16,44,75,10 - CONTROL "°±¥Î(&D)",IDC_RAD_DISABLE,"Button", BS_AUTORADIOBUTTON,16,54,75,10 - DEFPUSHBUTTON "½T©w",IDOK,8,74,45,14,WS_GROUP - PUSHBUTTON "¨ú®ø",IDCANCEL,57,74,45,14,WS_GROUP -END - -IDD_DRIVECFG DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " Àx¦s¼Ñ¹ï¬M(&m) ",IDC_STATIC,8,4,244,240 - CONTROL "Listview",IDC_LIST_DRIVES,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | - LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,18,232,76 - PUSHBUTTON "¥[¤J(&A)",IDC_BUTTON_ADD,15,98,37,14 - PUSHBUTTON "²¾°£(&R)",IDC_BUTTON_REMOVE,56,98,37,14 - PUSHBUTTON "¦Û°Ê°»´ú(&d)...",IDC_BUTTON_AUTODETECT,197,98,49,14 - - /* editing drive details */ - LTEXT "¸ô®|(&P)¡G",IDC_STATIC,15,123,20,9 - EDITTEXT IDC_EDIT_PATH,41,120,160,13,ES_AUTOHSCROLL | WS_TABSTOP - PUSHBUTTON "ÂsÄý(&B)...",IDC_BUTTON_BROWSE_PATH,206,120,40,13 - - LTEXT "Ãþ«¬(&T)¡G",IDC_STATIC_TYPE,15,138,21,10 - COMBOBOX IDC_COMBO_TYPE,41,135,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - - LTEXT "¼ÐÅÒ»P§Ç¸¹",IDC_LABELSERIAL_STATIC,15,155,95,10 - - PUSHBUTTON "Åã¥Ü¶i¶¥(&A)",IDC_BUTTON_SHOW_HIDE_ADVANCED,186,136,60,13 - CONTROL "¦Û°Ê±q¸Ë¸m°»´ú(&)¡G",IDC_RADIO_AUTODETECT,"Button", - BS_AUTORADIOBUTTON,15,166,93,10 - EDITTEXT IDC_EDIT_DEVICE,27,176,174,13,ES_AUTOHSCROLL - PUSHBUTTON "ÂsÄý(&w)...",IDC_BUTTON_BROWSE_DEVICE,206,176,40,13 - CONTROL "¤â°Ê«ü©w(&M)¡G",IDC_RADIO_ASSIGN,"Button", - BS_AUTORADIOBUTTON,15,195,69,10 - - LTEXT "¼ÐÅÒ(&L)¡G",IDC_STATIC_LABEL,33,208,29,12 - EDITTEXT IDC_EDIT_LABEL,63,205,78,13,ES_AUTOHSCROLL | WS_TABSTOP - LTEXT "§Ç¸¹(&e)¡G",IDC_STATIC_SERIAL,33,225,29,12 - EDITTEXT IDC_EDIT_SERIAL,63,221,78,13,ES_AUTOHSCROLL | WS_TABSTOP - - CONTROL "Åã¥ÜÁôÂÃÀÉ®×(&d)",IDC_SHOW_DOT_FILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,260,230,8 -END - -IDD_AUDIOCFG DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " ÅX°Êµ{¦¡¿ï¾Ü ",IDC_STATIC,8,4,244,195 - LTEXT "¤Ä¿ï¤è®Ø¨Ó¿ï¾Ü·Q­nªºÅX°Êµ{¦¡¡C ¤£¿ï¾Ü¥ô¦óÅX°Êµ{¦¡±N°±¥Î­µ®Ä¡C ¤£«Øij¦P®É¿ï¾Ü½Æ¼ÆªºÅX°Êµ{¦¡¡C «ö¤U·Æ¹«¥kÁä¨Ó¹ïÅX°Êµ{¦¡³]©w¡C",IDC_STATIC,15,20,227,30 - CONTROL "¸Ë¸m",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,15,50,140,140 - PUSHBUTTON "´ú¸Õ­µ®Ä(&T)",IDC_AUDIO_TEST,170,50,59,14 - PUSHBUTTON "±±¨î¥x(&C)",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 - GROUPBOX " DirectSound ",IDC_STATIC,8,205,244,60 - LTEXT "µwÅé¥[³t(&H)¡G ",IDC_STATIC,15,215,90,10 - COMBOBOX IDC_DSOUND_HW_ACCEL,100,213,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "¹w³]¨ú¼ËÀW²v(&S)¡G",IDC_STATIC,15,232,70,8 - COMBOBOX IDC_DSOUND_RATES,90,230,42,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "¹w³]¨ú¼Ë¦ì¤¸²v&B)¡G",IDC_STATIC,137,232,80,8 - COMBOBOX IDC_DSOUND_BITS,220,230,30,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "ÅX°Êµ{¦¡¼ÒÀÀ(&E)",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,250,230,10 -END - -IDD_DESKTOP_INTEGRATION DIALOG DISCARDABLE 0, 0, 260, 250 -STYLE WS_CHILD | WS_DISABLED -FONT 8, "PMingLiu" -BEGIN - GROUPBOX " ¥~Æ[ ",IDC_STATIC,8,4,244,106 - LTEXT "§G´º¥DÃD(&T)¡G",IDC_STATIC,15,16,130,8 - COMBOBOX IDC_THEME_THEMECOMBO,15,24,130,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "¦w¸Ë§G´º¥DÃD(&I)...",IDC_THEME_INSTALL,152,23,93,14 - LTEXT "°t¦â(&C)¡G",IDC_THEME_COLORTEXT,15,40,112,8 - COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "¤j¤p(&S)¡G",IDC_THEME_SIZETEXT,135,40,110,8 - COMBOBOX IDC_THEME_SIZECOMBO,135,48,110,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "ª«¥ó(&e)¡G",IDC_STATIC,15,64,112,8 - COMBOBOX IDC_SYSPARAM_COMBO,15,74,112,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "ÃC¦â(&o)¡G",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED - PUSHBUTTON "",IDC_SYSPARAM_COLOR,135,74,25,13,WS_DISABLED | BS_OWNERDRAW - LTEXT "¤j¤p(&z)¡G",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED - EDITTEXT IDC_SYSPARAM_SIZE,166,74,23,13,ES_AUTOHSCROLL | WS_TABSTOP | WS_DISABLED - CONTROL "",IDC_SYSPARAM_SIZE_UD,UPDOWN_CLASS,UDS_SETBUDDYINT | WS_DISABLED,187,74,15,13 - PUSHBUTTON "¦r«¬(&F)",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED - GROUPBOX " ¯S®í¸ê®Æ§¨(&h) ",IDC_STATIC,8,114,244,100 - CONTROL "Listview",IDC_LIST_SFPATHS,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | - LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,126,230,64 - CONTROL "³sµ²¦Ü(&L)¡G",IDC_LINK_SFPATH,"Button",BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED,15,195,50,13 - EDITTEXT IDC_EDIT_SFPATH,65,195,145,13,ES_AUTOHSCROLL|WS_TABSTOP|WS_DISABLED - PUSHBUTTON "ÂsÄý(&r)",IDC_BROWSE_SFPATH,215,195,30,13,WS_DISABLED -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_TAB_APPLICATIONS "À³¥Îµ{¦¡" - IDS_TAB_DLLS "¨ç¦¡®w" - IDS_TAB_DRIVES "Àx¦s¼Ñ" - IDS_CHOOSE_PATH "½Ð¿ï¾Ü unix ¸ê®Æ§¨¡C" - IDS_HIDE_ADVANCED "ÁôÂöi¶¥¿ï¶µ(&A)" - IDS_SHOW_ADVANCED "Åã¥Ü¶i¶¥¿ï¶µ(&A)" - IDS_NOTHEME "¡]µL§G´º¥DÃD¡^" - IDS_TAB_GRAPHICS "Åã¥Ü" - IDS_TAB_DESKTOP_INTEGRATION "®à­±¾ã¦X" - IDS_TAB_AUDIO "­µ®Ä" - IDS_TAB_ABOUT "Ãö©ó" - IDS_WINECFG_TITLE "Wine ³]©w" - IDS_WINECFG_TITLE_APP "Wine ©ó %s ªº³]©w" - IDS_THEMEFILE "§G´º¥DÃDÀÉ®×" - IDS_THEMEFILE_SELECT "¿ï¾Ü¤@­Ó§G´º¥DÃDÀÉ®×" - IDS_AUDIO_MISSING "¥Ø«e¦bµn¿ý¸ê°T¸Ì¨S¦³«ü©w¥ô¦ó­µ®ÄÅX°Êµ{¦¡¡C\n\n¤@­Ó±ÀÂ˪ºÅX°Êµ{¦¡¤w¹w¥ýÀ°§A¿ï¾Ü¡C\n§A¥i¥H¨Ï¥Î¦¹ÅX°Êµ{¦¡¡A©Î¬O¿ï¾Ü¨ä¥L¥i¥Îªº¡C\n\n§A¥²¶·ÂI¿ï¡u®M¥Î¡v¨Ï¿ï¾Ü¥Í®Ä¡C" - IDS_SHELL_FOLDER "¯S®í¸ê®Æ§¨" - IDS_LINKS_TO "³sµ²¦Ü" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DLL_WARNING "¤£«Øij¹ï³o­Ó¨ç¦¡®w§ó§ï¸ü¤J¶¶§Ç¡C\n§A½T©w­n¦p¦¹¶Ü¡H" - IDS_DLL_WARNING_CAPTION "ĵ§i¡G¨t²Î¨ç¦¡®w" - IDS_DLL_NATIVE "­ì¥Í" - IDS_DLL_BUILTIN "¤º«Ø" - IDS_DLL_NATIVE_BUILTIN "­ì¥Í¡A¤º«Ø" - IDS_DLL_BUILTIN_NATIVE "¤º«Ø¡B­ì¥Í" - IDS_DLL_DISABLED "°±¥Î" - IDS_DEFAULT_SETTINGS "¹w³]³]©w" - IDS_EXECUTABLE_FILTER "Wine µ{¦¡ (*.exe,*.exe.so)\0*.exe;*.exe.so\0" - IDS_USE_GLOBAL_SETTINGS "¨Ï¥Î¥þ°ì³]©w" - IDS_SELECT_EXECUTABLE "¿ï¾Ü¤@­Ó¥i°õ¦æÀÉ" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SHADER_MODE_HARDWARE "µwÅé" - IDS_SHADER_MODE_NONE "µL" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_DRIVE_UNKNOWN "¦Û°Ê°»´ú" - IDS_DRIVE_FIXED "¥»¾÷µwºÐ" - IDS_DRIVE_REMOTE "ºô¸ô¤À¨É" - IDS_DRIVE_REMOVABLE "³nºÐ¾÷" - IDS_DRIVE_CDROM "¥úºÐ" - IDS_DRIVE_LETTERS_EXCEEDED "§AµLªk¦A¼W¥[¥ô¦óÀx¦s¼Ñ¡C\n\n¨C­ÓÀx¦s¼Ñ¤ñ»Ý­n¦³¤@­Ó±q A ¨ì Z ¤§¶¡ªº­^¤å¦r¡A ©Ò¥H§A¤£¯à¾Ö¦³¶W¹L 26" IDS_SYSTEM_DRIVE_LABEL "¨t²ÎÀx¦s¼Ñ" - IDS_CONFIRM_DELETE_C "§A½T©w­n§R°£ C ¼Ñ¶Ü¡H\n\n¤j³¡¤Àªº Windows µ{¦¡³£°²©w C ¼Ñ¦s¦b¡A ¦Ó¨S¦³ C ¼Ñ®É´N·|¦º±o«ÜÄY­«¡C ¦pªG§A§R°£¤F¥¦¡A ½Ð°O±o­n­«·s«Ø¥ß¤@­Ó¡I" - IDS_COL_DRIVELETTER "¦r¥À" - IDS_COL_DRIVEMAPPING "Àx¦s¼Ñ¹ï¬M" - IDS_NO_DRIVE_C "§A¨S¦³ C ¼Ñ¡C ³o¤£¬O¥ó¦n¨Æ¡C\n\n½Ð°O±oÂI¿ï¡uÀx¦s¼Ñ¡v­¶ÅÒªº¡u¥[¤J¡v¨Ó«Ø¥ß¤@­Ó¡I\n" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ACCEL_FULL "§¹¥þ" - IDS_ACCEL_STANDARD "¼Ð·Ç" - IDS_ACCEL_BASIC "°ò¥»" - IDS_ACCEL_EMULATION "³nÅé¼ÒÀÀ" - IDS_DRIVER_ALSA "ALSA Driver" - IDS_DRIVER_ESOUND "EsounD Driver" - IDS_DRIVER_OSS "OSS Driver" - IDS_DRIVER_JACK "JACK Driver" - IDS_DRIVER_NAS "NAS Driver" - IDS_DRIVER_AUDIOIO "Audio IO (Solaris) Driver" - IDS_DRIVER_COREAUDIO "CoreAudio Driver" - IDS_OPEN_DRIVER_ERROR "µLªk¶}±Ò %s ¡I" - IDS_SOUNDDRIVERS "­µ®ÄÅX°Êµ{¦¡" - IDS_DEVICES_WAVEOUT "Wave ¿é¥X¸Ë¸m" - IDS_DEVICES_WAVEIN "Wave ¿é¤J¸Ë¸m" - IDS_DEVICES_MIDIOUT "MIDI ¿é¥X¸Ë¸m" - IDS_DEVICES_MIDIIN "MIDI ¿é¤J¸Ë¸m" - IDS_DEVICES_AUX "»²§U¸Ë¸m" - IDS_DEVICES_MIXER "²V­µ¾¹¸Ë¸m" - IDS_UNAVAILABLE_DRIVER "¦bµn¿ý¸ê°T¸Ì°O¿ýªºÅX°Êµ{¦¡¤£¥i¨Ï¥Î¡I\n\n¬O§_±N %s ±qµn¿ý¸ê°T¸Ì²¾°£¡H" - IDS_WARNING "ĵ§i" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDC_SYSPARAMS_BUTTON "±±¨î¶µ­I´º" - IDC_SYSPARAMS_BUTTON_TEXT "±±¨î¶µ¤å¦r" - IDC_SYSPARAMS_DESKTOP "®à­±" - IDC_SYSPARAMS_MENU "¿ï³æ­I´º" - IDC_SYSPARAMS_MENU_TEXT "¿ï³æ¤å¦r" - IDC_SYSPARAMS_SCROLLBAR "±²¶b" - IDC_SYSPARAMS_SELECTION "Selection Background" - IDC_SYSPARAMS_SELECTION_TEXT "Selection Text" - IDC_SYSPARAMS_TOOLTIP "ToolTip Background" - IDC_SYSPARAMS_TOOLTIP_TEXT "ToolTip Text" - IDC_SYSPARAMS_WINDOW "Window Background" - IDC_SYSPARAMS_WINDOW_TEXT "Window Text" - IDC_SYSPARAMS_ACTIVE_TITLE "Active Title Bar" - IDC_SYSPARAMS_ACTIVE_TITLE_TEXT "Active Title Text" - IDC_SYSPARAMS_INACTIVE_TITLE "Inactive Title Bar" - IDC_SYSPARAMS_INACTIVE_TITLE_TEXT "Inactive Title Text" -END +/* + * WineCfg resources + * Simplified and Traditional Chinese Language Support + * + * Copyright 2008 Sin-ta Hsiea + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDR_WINECFG MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "设置", IDC_AUDIO_CONFIGURE + END +END + +IDD_ABOUTCFG DIALOGEX 0, 0, 260, 270 +STYLE WS_CHILD +FONT 9, "MS Song" +BEGIN + LTEXT PACKAGE_STRING,IDC_STATIC,119,17,120,8 + CONTROL IDB_WINE,IDC_STATIC,"Static",SS_BITMAP ,15,17,157,111 + LTEXT "http://www.winehq.org/",IDC_STATIC,119,31,106,8 + LTEXT "这个函数库是自由软件,你可以\n遵照自由软件基金会出版的\nGNU LGPL 2.1 版或新版的许可\n条款来修改和重新发布这一程序。", + IDC_STATIC,119,44,124,72 + GROUPBOX " Windows 注册信息 ", IDC_STATIC, 15, 110, 230, 55 + LTEXT "姓名:", IDC_STATIC, 22, 126, 40, 20 + LTEXT "单位:", IDC_STATIC, 22, 140, 50, 20 + EDITTEXT IDC_ABT_OWNER, 75, 126, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP + EDITTEXT IDC_ABT_ORG, 75, 140, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP +END + +IDD_APPCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " 应用程序设置 ",IDC_STATIC, 8,4,244,240 + LTEXT "Wine 可以对不同程序假装成不同版本的 Windows. 「函数库」与「显示」页签将连结到这个页签, 除了调整默认设置, 也能调整个别程序的设置。", + IDC_STATIC,15,20,227,30 + CONTROL "Applications",IDC_APP_LISTVIEW,"SysListView32",WS_BORDER | WS_TABSTOP | LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS, + 15,50,230,150 + PUSHBUTTON "增加程序设置(&A)...",IDC_APP_ADDAPP, 90,204,75,14 + PUSHBUTTON "移除程序设置(&R)",IDC_APP_REMOVEAPP, 170,204,75,14 + LTEXT "&Windows 版本:",IDC_STATIC,17,226,58,8 + COMBOBOX IDC_WINVER,83,224,163,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_GRAPHCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " 视窗设置 ",IDC_STATIC,8,4,244,84 + CONTROL "允许 DirectX 程序防止光标离开它的视窗(&m)",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 + CONTROL "允许视窗管理器装饰视窗(&d)",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 + CONTROL "允许视窗管理器控制视窗(&w)",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 + CONTROL "模拟一个虚拟桌面(&d)",IDC_ENABLE_DESKTOP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,15,56,230,8 + LTEXT "桌面大小(&s):",IDC_DESKTOP_SIZE,15,70,44,8,WS_DISABLED + LTEXT "X",IDC_DESKTOP_BY,109,70,8,8,WS_DISABLED + EDITTEXT IDC_DESKTOP_WIDTH,64,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + EDITTEXT IDC_DESKTOP_HEIGHT,117,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + + GROUPBOX " Direct3D ",IDC_STATIC,8,95,244,49 + LTEXT "&Vertex Shader支持:",IDC_STATIC,15,110,80,32 + COMBOBOX IDC_D3D_VSHADER_MODE,100,108,145,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "允许&Pixel Shader(如果硬件支持)",IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 + + GROUPBOX " 屏幕解析度(&R) ",IDC_STATIC,8,151,244,93 + CONTROL "", IDC_RES_TRACKBAR, "msctls_trackbar32",WS_TABSTOP,12,161,187,15 + EDITTEXT IDC_RES_DPIEDIT,204,161,23,13,ES_NUMBER|WS_TABSTOP + LTEXT "dpi",IDC_STATIC,235,163,10,8 + LTEXT "This is a sample text using 10 point Tahoma",IDC_RES_FONT_PREVIEW,15,181,230,55 +END + +IDD_DLLCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " DLL 顶替 ",IDC_STATIC,8,4,244,240 + LTEXT "动态连结函数库可以个别设置, 来选择使用 Wine 提供的内建版本, 还是使用取自 Windows 或程序所提供的原装版本。" + ,IDC_STATIC,16,16,220,32 + LTEXT "新增函数库顶替(&N):",IDC_STATIC,16,58,100,8 + COMBOBOX IDC_DLLCOMBO,16,68,140,14,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_SORT | CBS_LOWERCASE + PUSHBUTTON "加入(&A)",IDC_DLLS_ADDDLL, 164,68,82,13,BS_DEFPUSHBUTTON + LTEXT "已有的函数库顶替(&o):",IDC_STATIC,16,86,100,8 + LISTBOX IDC_DLLS_LIST,16,96,140,140,WS_BORDER | WS_TABSTOP | WS_VSCROLL + PUSHBUTTON "编辑(&E)",IDC_DLLS_EDITDLL,164,96,82,14 + PUSHBUTTON "删除(&R)",IDC_DLLS_REMOVEDLL,164,114,82,14 +END + +IDD_LOADORDER DIALOG DISCARDABLE 80, 90, 110, 92 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "编辑顶替" +FONT 9, "MS Song" +BEGIN + GROUPBOX " 载入顺序 ",IDC_STATIC,8,4,94,66 + CONTROL "内建(Wine)(&B)",IDC_RAD_BUILTIN,"Button", BS_AUTORADIOBUTTON | WS_GROUP,16,14,75,10 + CONTROL "原装(Windows)(&N)",IDC_RAD_NATIVE,"Button", BS_AUTORADIOBUTTON,16,24,75,10 + CONTROL "内建先于原装(&l)",IDC_RAD_BUILTIN_NATIVE,"Button", BS_AUTORADIOBUTTON,16,34,75,10 + CONTROL "原装先于内建(&v)",IDC_RAD_NATIVE_BUILTIN,"Button", BS_AUTORADIOBUTTON,16,44,75,10 + CONTROL "停用(&D)",IDC_RAD_DISABLE,"Button", BS_AUTORADIOBUTTON,16,54,75,10 + DEFPUSHBUTTON "确定",IDOK,8,74,45,14,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,57,74,45,14,WS_GROUP +END + +IDD_DRIVECFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " 驱动器映射(&m) ",IDC_STATIC,8,4,244,240 + CONTROL "Listview",IDC_LIST_DRIVES,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | + LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,18,232,76 + PUSHBUTTON "加入(&A)",IDC_BUTTON_ADD,15,98,37,14 + PUSHBUTTON "删除(&R)",IDC_BUTTON_REMOVE,56,98,37,14 + PUSHBUTTON "自动侦测(&d)",IDC_BUTTON_AUTODETECT,197,98,49,14 + + /* editing drive details */ + LTEXT "路径(&P):",IDC_STATIC,15,123,20,9 + EDITTEXT IDC_EDIT_PATH,41,120,160,13,ES_AUTOHSCROLL | WS_TABSTOP + PUSHBUTTON "浏览(&B)...",IDC_BUTTON_BROWSE_PATH,206,120,40,13 + + LTEXT "类型(&T):",IDC_STATIC_TYPE,15,138,21,10 + COMBOBOX IDC_COMBO_TYPE,41,135,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + LTEXT "标签与序号",IDC_LABELSERIAL_STATIC,15,155,95,10 + + PUSHBUTTON "显示进阶(&A)",IDC_BUTTON_SHOW_HIDE_ADVANCED,186,136,60,13 + CONTROL "自动从装置侦测(&):",IDC_RADIO_AUTODETECT,"Button", + BS_AUTORADIOBUTTON,15,166,93,10 + EDITTEXT IDC_EDIT_DEVICE,27,176,174,13,ES_AUTOHSCROLL + PUSHBUTTON "浏览(&w)...",IDC_BUTTON_BROWSE_DEVICE,206,176,40,13 + CONTROL "手动指定(&M):",IDC_RADIO_ASSIGN,"Button", + BS_AUTORADIOBUTTON,15,195,69,10 + + LTEXT "标签(&L):",IDC_STATIC_LABEL,33,208,29,12 + EDITTEXT IDC_EDIT_LABEL,63,205,78,13,ES_AUTOHSCROLL | WS_TABSTOP + LTEXT "序号(&e):",IDC_STATIC_SERIAL,33,225,29,12 + EDITTEXT IDC_EDIT_SERIAL,63,221,78,13,ES_AUTOHSCROLL | WS_TABSTOP + + CONTROL "显示隐藏文件(&d)",IDC_SHOW_DOT_FILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,260,230,8 +END + +IDD_AUDIOCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " 驱动程序选择 ",IDC_STATIC,8,4,244,195 + LTEXT "请选择想要的驱动程序。不选择任何驱动程序将停用音效。 不建议同时选择多个驱动程序。 按下鼠标右键来对驱动程序设置。",IDC_STATIC,15,20,227,30 + CONTROL "装置",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,15,50,140,140 + PUSHBUTTON "测试音效(&T)",IDC_AUDIO_TEST,170,50,59,14 + PUSHBUTTON "控制台(&C)",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 + GROUPBOX " DirectSound ",IDC_STATIC,8,205,244,60 + LTEXT "硬件加速(&H): ",IDC_STATIC,15,215,90,10 + COMBOBOX IDC_DSOUND_HW_ACCEL,100,213,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "默认取样频率(&S):",IDC_STATIC,15,232,70,8 + COMBOBOX IDC_DSOUND_RATES,90,230,42,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "默认取样位元率&B):",IDC_STATIC,137,232,80,8 + COMBOBOX IDC_DSOUND_BITS,220,230,30,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "驱动程序模拟(&E)",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,250,230,10 +END + +IDD_DESKTOP_INTEGRATION DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 9, "MS Song" +BEGIN + GROUPBOX " 外观 ",IDC_STATIC,8,4,244,106 + LTEXT "布景主题(&T):",IDC_STATIC,15,16,130,8 + COMBOBOX IDC_THEME_THEMECOMBO,15,24,130,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "安装布景主题(&I)...",IDC_THEME_INSTALL,152,23,93,14 + LTEXT "配色(&C):",IDC_THEME_COLORTEXT,15,40,112,8 + COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "大小(&S):",IDC_THEME_SIZETEXT,135,40,110,8 + COMBOBOX IDC_THEME_SIZECOMBO,135,48,110,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "物件(&e):",IDC_STATIC,15,64,112,8 + COMBOBOX IDC_SYSPARAM_COMBO,15,74,112,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "颜色(&o):",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED + PUSHBUTTON "",IDC_SYSPARAM_COLOR,135,74,25,13,WS_DISABLED | BS_OWNERDRAW + LTEXT "大小(&z):",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED + EDITTEXT IDC_SYSPARAM_SIZE,166,74,23,13,ES_AUTOHSCROLL | WS_TABSTOP | WS_DISABLED + CONTROL "",IDC_SYSPARAM_SIZE_UD,UPDOWN_CLASS,UDS_SETBUDDYINT | WS_DISABLED,187,74,15,13 + PUSHBUTTON "字体(&F)",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED + GROUPBOX " 特殊文件夹(&h) ",IDC_STATIC,8,114,244,100 + CONTROL "Listview",IDC_LIST_SFPATHS,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | + LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,126,230,64 + CONTROL "连结至(&L):",IDC_LINK_SFPATH,"Button",BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED,15,195,50,13 + EDITTEXT IDC_EDIT_SFPATH,65,195,145,13,ES_AUTOHSCROLL|WS_TABSTOP|WS_DISABLED + PUSHBUTTON "浏览(&r)",IDC_BROWSE_SFPATH,215,195,30,13,WS_DISABLED +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TAB_APPLICATIONS "应用程序" + IDS_TAB_DLLS "函数库" + IDS_TAB_DRIVES "驱动器" + IDS_CHOOSE_PATH "请选择 unix 文件夹。" + IDS_HIDE_ADVANCED "隐藏进阶选项(&A)" + IDS_SHOW_ADVANCED "显示进阶选项(&A)" + IDS_NOTHEME "(无背景主题)" + IDS_TAB_GRAPHICS "显示" + IDS_TAB_DESKTOP_INTEGRATION "桌面整合" + IDS_TAB_AUDIO "音效" + IDS_TAB_ABOUT "关于" + IDS_WINECFG_TITLE "Wine 设置" + IDS_WINECFG_TITLE_APP "Wine 于 %s 的设置" + IDS_THEMEFILE "背景主题文件" + IDS_THEMEFILE_SELECT "选择一个背景主题文件" + IDS_AUDIO_MISSING "目前在登录信息里没有指定任何音效驱动程序。\n\n一个推荐的驱动程序已预先帮你选择。\n你可以使用此驱动程序,或是选择其他可用的。\n\n你必须点选「套用」使选择生效。" + IDS_SHELL_FOLDER "特殊文件夹" + IDS_LINKS_TO "连结至" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DLL_WARNING "不建议对这个函数库更改载入顺序。\n你确定要如此吗?" + IDS_DLL_WARNING_CAPTION "警告:系统函数库" + IDS_DLL_NATIVE "原装" + IDS_DLL_BUILTIN "内建" + IDS_DLL_NATIVE_BUILTIN "原装,内建" + IDS_DLL_BUILTIN_NATIVE "内建、原装" + IDS_DLL_DISABLED "停用" + IDS_DEFAULT_SETTINGS "默认设置" + IDS_EXECUTABLE_FILTER "Wine 程序 (*.exe,*.exe.so)\0*.exe;*.exe.so\0" + IDS_USE_GLOBAL_SETTINGS "使用全域设置" + IDS_SELECT_EXECUTABLE "选择一个可运行程序" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SHADER_MODE_HARDWARE "硬件" + IDS_SHADER_MODE_NONE "无" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DRIVE_UNKNOWN "自动侦测" + IDS_DRIVE_FIXED "硬盘驱动器" + IDS_DRIVE_REMOTE "网络驱动器" + IDS_DRIVE_REMOVABLE "软盘驱动器" + IDS_DRIVE_CDROM "光盘驱动器" + IDS_DRIVE_LETTERS_EXCEEDED "你无法再增加任何驱动器。\n\n每个驱动器比需要有一个从 A 到 Z 之间的英文字, 所以你不能拥有超过 26" IDS_SYSTEM_DRIVE_LABEL "系统驱动器" + IDS_CONFIRM_DELETE_C "你确定要删除 C 盘吗?\n\n大部分的 Windows 程序都假定 C 盘存在, 而没有 C 盘时就会死得很严重。 如果你删除了它, 请记得要重新建立一个!" + IDS_COL_DRIVELETTER "字母" + IDS_COL_DRIVEMAPPING "驱动器映射" + IDS_NO_DRIVE_C "你没有 C 盘。 这不是件好事。\n\n请记得点选「驱动器」页签的「加入」来建立一个!\n" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ACCEL_FULL "完全" + IDS_ACCEL_STANDARD "标准" + IDS_ACCEL_BASIC "基本" + IDS_ACCEL_EMULATION "软件模拟" + IDS_DRIVER_ALSA "ALSA 驱动" + IDS_DRIVER_ESOUND "EsounD 驱动" + IDS_DRIVER_OSS "OSS 驱动" + IDS_DRIVER_JACK "JACK 驱动" + IDS_DRIVER_NAS "NAS 驱动" + IDS_DRIVER_AUDIOIO "Audio IO (Solaris) 驱动" + IDS_DRIVER_COREAUDIO "CoreAudio 驱动" + IDS_OPEN_DRIVER_ERROR "无法打开 %s !" + IDS_SOUNDDRIVERS "音效驱动程序" + IDS_DEVICES_WAVEOUT "Wave 输出装置" + IDS_DEVICES_WAVEIN "Wave 输入装置" + IDS_DEVICES_MIDIOUT "MIDI 输出装置" + IDS_DEVICES_MIDIIN "MIDI 输入装置" + IDS_DEVICES_AUX "辅助装置" + IDS_DEVICES_MIXER "混音器装置" + IDS_UNAVAILABLE_DRIVER "在登录信息里记录的驱动程序不可使用!\n\n是否将 %s 从登录信息里删除?" + IDS_WARNING "警告" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDC_SYSPARAMS_BUTTON "按钮背景" + IDC_SYSPARAMS_BUTTON_TEXT "按钮文字" + IDC_SYSPARAMS_DESKTOP "桌面" + IDC_SYSPARAMS_MENU "菜单背景" + IDC_SYSPARAMS_MENU_TEXT "菜单文字" + IDC_SYSPARAMS_SCROLLBAR "卷轴" + IDC_SYSPARAMS_SELECTION "选择区背景" + IDC_SYSPARAMS_SELECTION_TEXT "选择区文字" + IDC_SYSPARAMS_TOOLTIP "提示区背景" + IDC_SYSPARAMS_TOOLTIP_TEXT "提示区文字" + IDC_SYSPARAMS_WINDOW "视窗背景" + IDC_SYSPARAMS_WINDOW_TEXT "视窗文字" + IDC_SYSPARAMS_ACTIVE_TITLE "当前标题栏" + IDC_SYSPARAMS_ACTIVE_TITLE_TEXT "当前标题栏文字" + IDC_SYSPARAMS_INACTIVE_TITLE "非当前标题栏" + IDC_SYSPARAMS_INACTIVE_TITLE_TEXT "非当前标题栏文字" +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDR_WINECFG MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "設定", IDC_AUDIO_CONFIGURE + END +END + +IDD_ABOUTCFG DIALOGEX 0, 0, 260, 270 +STYLE WS_CHILD +FONT 8, "PMingLiu" +BEGIN + LTEXT PACKAGE_STRING,IDC_STATIC,119,17,120,8 + CONTROL IDB_WINE,IDC_STATIC,"Static",SS_BITMAP ,15,17,157,111 + LTEXT "http://www.winehq.org/",IDC_STATIC,119,31,106,8 + LTEXT "這個函式庫是自由軟體﹐你可以遵照\n自由軟體基金會出版的 GNU LGPL 2.1\n版或新版的許可條款來修改和重新\n發佈這一程式。", + IDC_STATIC,119,44,124,72 + GROUPBOX " Windows 註冊信息 ", IDC_STATIC, 15, 110, 230, 55 + LTEXT "姓名:", IDC_STATIC, 22, 126, 40, 20 + LTEXT "單位:", IDC_STATIC, 22, 140, 50, 20 + EDITTEXT IDC_ABT_OWNER, 75, 126, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP + EDITTEXT IDC_ABT_ORG, 75, 140, 160, 13, ES_AUTOHSCROLL | WS_TABSTOP +END + +IDD_APPCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 應用程式設定 ",IDC_STATIC, 8,4,244,240 + LTEXT "Wine 可以對不同程式假裝成不同版本的 Windows 。 「函式庫」 與 「顯示」 頁籤將連結到這個頁籤, 除了調整預設設定, 也能調整個別程式的設定。", + IDC_STATIC,15,20,227,30 + CONTROL "Applications",IDC_APP_LISTVIEW,"SysListView32",WS_BORDER | WS_TABSTOP | LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS, + 15,50,230,150 + PUSHBUTTON "增加程式設定(&A)...",IDC_APP_ADDAPP, 90,204,75,14 + PUSHBUTTON "移除程式設定(&R)",IDC_APP_REMOVEAPP, 170,204,75,14 + LTEXT "&Windows 版本:",IDC_STATIC,17,226,58,8 + COMBOBOX IDC_WINVER,83,224,163,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_GRAPHCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 視窗設定 ",IDC_STATIC,8,4,244,84 + CONTROL "允許 DirectX 程式防止游標離開它的視窗(&m)",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 + CONTROL "允許視窗管理器裝飾視窗(&d)",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 + CONTROL "允許視窗管理器控制視窗(&w)",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 + CONTROL "模擬一個虛擬桌面(&d)",IDC_ENABLE_DESKTOP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,15,56,230,8 + LTEXT "桌面大小(&s):",IDC_DESKTOP_SIZE,15,70,44,8,WS_DISABLED + LTEXT "X",IDC_DESKTOP_BY,109,70,8,8,WS_DISABLED + EDITTEXT IDC_DESKTOP_WIDTH,64,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + EDITTEXT IDC_DESKTOP_HEIGHT,117,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + + GROUPBOX " Direct3D ",IDC_STATIC,8,95,244,49 + LTEXT "&Vertex Shader支援:",IDC_STATIC,15,110,80,32 + COMBOBOX IDC_D3D_VSHADER_MODE,100,108,145,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "允許&Pixel Shader(如果硬體支援)",IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 + + GROUPBOX " 螢幕解析度(&R) ",IDC_STATIC,8,151,244,93 + CONTROL "", IDC_RES_TRACKBAR, "msctls_trackbar32",WS_TABSTOP,12,161,187,15 + EDITTEXT IDC_RES_DPIEDIT,204,161,23,13,ES_NUMBER|WS_TABSTOP + LTEXT "dpi",IDC_STATIC,235,163,10,8 + LTEXT "This is a sample text using 10 point Tahoma",IDC_RES_FONT_PREVIEW,15,181,230,55 +END + +IDD_DLLCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " DLL 頂替 ",IDC_STATIC,8,4,244,240 + LTEXT "動態連結函式庫可以個別設定,來指定要使用 Wine 提供的內建版本,還是使用取自 Windows 或程式所提供的原生版本。" + ,IDC_STATIC,16,16,220,32 + LTEXT "新增函式庫頂替(&N):",IDC_STATIC,16,58,100,8 + COMBOBOX IDC_DLLCOMBO,16,68,140,14,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_SORT | CBS_LOWERCASE + PUSHBUTTON "加入(&A)",IDC_DLLS_ADDDLL, 164,68,82,13,BS_DEFPUSHBUTTON + LTEXT "已有的函式庫頂替(&o):",IDC_STATIC,16,86,100,8 + LISTBOX IDC_DLLS_LIST,16,96,140,140,WS_BORDER | WS_TABSTOP | WS_VSCROLL + PUSHBUTTON "編輯(&E)",IDC_DLLS_EDITDLL,164,96,82,14 + PUSHBUTTON "移除(&R)",IDC_DLLS_REMOVEDLL,164,114,82,14 +END + +IDD_LOADORDER DIALOG DISCARDABLE 80, 90, 110, 92 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "編輯頂替" +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 載入順序 ",IDC_STATIC,8,4,94,66 + CONTROL "內建(Wine)(&B)",IDC_RAD_BUILTIN,"Button", BS_AUTORADIOBUTTON | WS_GROUP,16,14,75,10 + CONTROL "原生(Windows)(&N)",IDC_RAD_NATIVE,"Button", BS_AUTORADIOBUTTON,16,24,75,10 + CONTROL "內建先於原生(&l)",IDC_RAD_BUILTIN_NATIVE,"Button", BS_AUTORADIOBUTTON,16,34,75,10 + CONTROL "原生先於內建(&v)",IDC_RAD_NATIVE_BUILTIN,"Button", BS_AUTORADIOBUTTON,16,44,75,10 + CONTROL "停用(&D)",IDC_RAD_DISABLE,"Button", BS_AUTORADIOBUTTON,16,54,75,10 + DEFPUSHBUTTON "確定",IDOK,8,74,45,14,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,57,74,45,14,WS_GROUP +END + +IDD_DRIVECFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 儲存槽對映(&m) ",IDC_STATIC,8,4,244,240 + CONTROL "Listview",IDC_LIST_DRIVES,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | + LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,18,232,76 + PUSHBUTTON "加入(&A)",IDC_BUTTON_ADD,15,98,37,14 + PUSHBUTTON "移除(&R)",IDC_BUTTON_REMOVE,56,98,37,14 + PUSHBUTTON "自動偵測(&d)...",IDC_BUTTON_AUTODETECT,197,98,49,14 + + /* editing drive details */ + LTEXT "路徑(&P):",IDC_STATIC,15,123,20,9 + EDITTEXT IDC_EDIT_PATH,41,120,160,13,ES_AUTOHSCROLL | WS_TABSTOP + PUSHBUTTON "瀏覽(&B)...",IDC_BUTTON_BROWSE_PATH,206,120,40,13 + + LTEXT "類型(&T):",IDC_STATIC_TYPE,15,138,21,10 + COMBOBOX IDC_COMBO_TYPE,41,135,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + LTEXT "標籤與序號",IDC_LABELSERIAL_STATIC,15,155,95,10 + + PUSHBUTTON "顯示進階(&A)",IDC_BUTTON_SHOW_HIDE_ADVANCED,186,136,60,13 + CONTROL "自動從裝置偵測(&):",IDC_RADIO_AUTODETECT,"Button", + BS_AUTORADIOBUTTON,15,166,93,10 + EDITTEXT IDC_EDIT_DEVICE,27,176,174,13,ES_AUTOHSCROLL + PUSHBUTTON "瀏覽(&w)...",IDC_BUTTON_BROWSE_DEVICE,206,176,40,13 + CONTROL "手動指定(&M):",IDC_RADIO_ASSIGN,"Button", + BS_AUTORADIOBUTTON,15,195,69,10 + + LTEXT "標籤(&L):",IDC_STATIC_LABEL,33,208,29,12 + EDITTEXT IDC_EDIT_LABEL,63,205,78,13,ES_AUTOHSCROLL | WS_TABSTOP + LTEXT "序號(&e):",IDC_STATIC_SERIAL,33,225,29,12 + EDITTEXT IDC_EDIT_SERIAL,63,221,78,13,ES_AUTOHSCROLL | WS_TABSTOP + + CONTROL "顯示隱藏檔案(&d)",IDC_SHOW_DOT_FILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,260,230,8 +END + +IDD_AUDIOCFG DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 驅動程式選擇 ",IDC_STATIC,8,4,244,195 + LTEXT "請選擇想要的驅動程式。不選擇任何驅動程式將停用音效。不建議同時選擇多個驅動程式。按下滑鼠右鍵來對驅動程式設定。",IDC_STATIC,15,20,227,30 + CONTROL "裝置",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,15,50,140,140 + PUSHBUTTON "測試音效(&T)",IDC_AUDIO_TEST,170,50,59,14 + PUSHBUTTON "控制台(&C)",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 + GROUPBOX " DirectSound ",IDC_STATIC,8,205,244,60 + LTEXT "硬體加速(&H): ",IDC_STATIC,15,215,90,10 + COMBOBOX IDC_DSOUND_HW_ACCEL,100,213,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "預設取樣頻率(&S):",IDC_STATIC,15,232,70,8 + COMBOBOX IDC_DSOUND_RATES,90,230,42,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "預設取樣位元率&B):",IDC_STATIC,137,232,80,8 + COMBOBOX IDC_DSOUND_BITS,220,230,30,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "驅動程式模擬(&E)",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,250,230,10 +END + +IDD_DESKTOP_INTEGRATION DIALOG DISCARDABLE 0, 0, 260, 250 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "PMingLiu" +BEGIN + GROUPBOX " 外觀 ",IDC_STATIC,8,4,244,106 + LTEXT "佈景主題(&T):",IDC_STATIC,15,16,130,8 + COMBOBOX IDC_THEME_THEMECOMBO,15,24,130,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "安裝佈景主題(&I)...",IDC_THEME_INSTALL,152,23,93,14 + LTEXT "配色(&C):",IDC_THEME_COLORTEXT,15,40,112,8 + COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "大小(&S):",IDC_THEME_SIZETEXT,135,40,110,8 + COMBOBOX IDC_THEME_SIZECOMBO,135,48,110,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "物件(&e):",IDC_STATIC,15,64,112,8 + COMBOBOX IDC_SYSPARAM_COMBO,15,74,112,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "顏色(&o):",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED + PUSHBUTTON "",IDC_SYSPARAM_COLOR,135,74,25,13,WS_DISABLED | BS_OWNERDRAW + LTEXT "大小(&z):",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED + EDITTEXT IDC_SYSPARAM_SIZE,166,74,23,13,ES_AUTOHSCROLL | WS_TABSTOP | WS_DISABLED + CONTROL "",IDC_SYSPARAM_SIZE_UD,UPDOWN_CLASS,UDS_SETBUDDYINT | WS_DISABLED,187,74,15,13 + PUSHBUTTON "字型(&F)",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED + GROUPBOX " 特殊資料夾(&h) ",IDC_STATIC,8,114,244,100 + CONTROL "Listview",IDC_LIST_SFPATHS,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | + LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,126,230,64 + CONTROL "連結至(&L):",IDC_LINK_SFPATH,"Button",BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED,15,195,50,13 + EDITTEXT IDC_EDIT_SFPATH,65,195,145,13,ES_AUTOHSCROLL|WS_TABSTOP|WS_DISABLED + PUSHBUTTON "瀏覽(&r)",IDC_BROWSE_SFPATH,215,195,30,13,WS_DISABLED +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TAB_APPLICATIONS "應用程式" + IDS_TAB_DLLS "函式庫" + IDS_TAB_DRIVES "儲存槽" + IDS_CHOOSE_PATH "請選擇 unix 資料夾。" + IDS_HIDE_ADVANCED "隱藏進階選項(&A)" + IDS_SHOW_ADVANCED "顯示進階選項(&A)" + IDS_NOTHEME "(無佈景主題)" + IDS_TAB_GRAPHICS "顯示" + IDS_TAB_DESKTOP_INTEGRATION "桌面整合" + IDS_TAB_AUDIO "音效" + IDS_TAB_ABOUT "關於" + IDS_WINECFG_TITLE "Wine 設定" + IDS_WINECFG_TITLE_APP "Wine 於 %s 的設定" + IDS_THEMEFILE "佈景主題檔案" + IDS_THEMEFILE_SELECT "選擇一個佈景主題檔案" + IDS_AUDIO_MISSING "目前在登錄資訊裡沒有指定任何音效驅動程式。\n\n一個推薦的驅動程式已預先幫你選擇。\n你可以使用此驅動程式,或是選擇其他可用的。\n\n你必須點選「套用」使選擇生效。" + IDS_SHELL_FOLDER "特殊資料夾" + IDS_LINKS_TO "連結至" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DLL_WARNING "不建議對這個函式庫更改載入順序。\n你確定要如此嗎?" + IDS_DLL_WARNING_CAPTION "警告:系統函式庫" + IDS_DLL_NATIVE "原生" + IDS_DLL_BUILTIN "內建" + IDS_DLL_NATIVE_BUILTIN "原生,內建" + IDS_DLL_BUILTIN_NATIVE "內建、原生" + IDS_DLL_DISABLED "停用" + IDS_DEFAULT_SETTINGS "預設設定" + IDS_EXECUTABLE_FILTER "Wine 程式 (*.exe,*.exe.so)\0*.exe;*.exe.so\0" + IDS_USE_GLOBAL_SETTINGS "使用全域設定" + IDS_SELECT_EXECUTABLE "選擇一個可執行檔" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_SHADER_MODE_HARDWARE "硬體" + IDS_SHADER_MODE_NONE "無" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DRIVE_UNKNOWN "自動偵測" + IDS_DRIVE_FIXED "本機硬碟" + IDS_DRIVE_REMOTE "網路分享" + IDS_DRIVE_REMOVABLE "軟碟機" + IDS_DRIVE_CDROM "光碟" + IDS_DRIVE_LETTERS_EXCEEDED "你無法再增加任何儲存槽。\n\n每個儲存槽比需要有一個從 A 到 Z 之間的英文字, 所以你不能擁有超過 26" IDS_SYSTEM_DRIVE_LABEL "系統儲存槽" + IDS_CONFIRM_DELETE_C "你確定要刪除 C 槽嗎?\n\n大部分的 Windows 程式都假定 C 槽存在, 而沒有 C 槽時就會死得很嚴重。 如果你刪除了它, 請記得要重新建立一個!" + IDS_COL_DRIVELETTER "字母" + IDS_COL_DRIVEMAPPING "儲存槽對映" + IDS_NO_DRIVE_C "你沒有 C 槽。 這不是件好事。\n\n請記得點選「儲存槽」頁籤的「加入」來建立一個!\n" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ACCEL_FULL "完全" + IDS_ACCEL_STANDARD "標準" + IDS_ACCEL_BASIC "基本" + IDS_ACCEL_EMULATION "軟體模擬" + IDS_DRIVER_ALSA "ALSA 驅動" + IDS_DRIVER_ESOUND "EsounD 驅動" + IDS_DRIVER_OSS "OSS 驅動" + IDS_DRIVER_JACK "JACK 驅動" + IDS_DRIVER_NAS "NAS 驅動" + IDS_DRIVER_AUDIOIO "Audio IO (Solaris) 驅動" + IDS_DRIVER_COREAUDIO "CoreAudio 驅動" + IDS_OPEN_DRIVER_ERROR "無法開啟 %s !" + IDS_SOUNDDRIVERS "音效驅動程式" + IDS_DEVICES_WAVEOUT "Wave 輸出裝置" + IDS_DEVICES_WAVEIN "Wave 輸入裝置" + IDS_DEVICES_MIDIOUT "MIDI 輸出裝置" + IDS_DEVICES_MIDIIN "MIDI 輸入裝置" + IDS_DEVICES_AUX "輔助裝置" + IDS_DEVICES_MIXER "混音器裝置" + IDS_UNAVAILABLE_DRIVER "在登錄資訊裡記錄的驅動程式不可使用!\n\n是否將 %s 從登錄資訊裡移除?" + IDS_WARNING "警告" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDC_SYSPARAMS_BUTTON "按鈕背景" + IDC_SYSPARAMS_BUTTON_TEXT "按鈕文字" + IDC_SYSPARAMS_DESKTOP "桌面" + IDC_SYSPARAMS_MENU "功能表背景" + IDC_SYSPARAMS_MENU_TEXT "功能表文字" + IDC_SYSPARAMS_SCROLLBAR "捲軸" + IDC_SYSPARAMS_SELECTION "選择區背景" + IDC_SYSPARAMS_SELECTION_TEXT "選择區文字" + IDC_SYSPARAMS_TOOLTIP "提示區背景" + IDC_SYSPARAMS_TOOLTIP_TEXT "提示區文字" + IDC_SYSPARAMS_WINDOW "視窗背景" + IDC_SYSPARAMS_WINDOW_TEXT "視窗文字" + IDC_SYSPARAMS_ACTIVE_TITLE "當前標題欄" + IDC_SYSPARAMS_ACTIVE_TITLE_TEXT "當前標題欄文字" + IDC_SYSPARAMS_INACTIVE_TITLE "非當前標題欄" + IDC_SYSPARAMS_INACTIVE_TITLE_TEXT "非當前標題欄文字" +END + +#pragma code_page(default) diff --git a/programs/wineconsole/wineconsole_Zh.rc b/programs/wineconsole/wineconsole_Zh.rc index d739e33062a..c7a739e54e9 100644 --- a/programs/wineconsole/wineconsole_Zh.rc +++ b/programs/wineconsole/wineconsole_Zh.rc @@ -1,7 +1,8 @@ /* - * WineConsole Simplified Chinese Language Support + * WineConsole (Simplified and Traditional Chinese Language Support) * * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,63 +19,66 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STRINGTABLE BEGIN -IDS_EDIT, "±à¼­£¨&E£©" -IDS_DEFAULT, "ÉèΪĬÈÏÖµ£¨&D£©" -IDS_PROPERTIES, "ÊôÐÔ£¨&P£©" -IDS_MARK, "±ê¼Ç£¨&M£©" -IDS_COPY, "¸´ÖÆ£¨&C£©" -IDS_PASTE, "Õ³Ìù£¨&P£©" -IDS_SELECTALL, "È«Ñ¡£¨&S£©" -IDS_SCROLL, "¹ö¶¯£¨&R£©" -IDS_SEARCH, "ËÑË÷£¨&E£©" -IDS_FNT_DISPLAY, "ÿ¸ö×Ö¶¼ÊÇ %ld ¸öÏñËØ¿í£¬%ld ¸öÏñËظß" -IDS_FNT_PREVIEW_1, "ÕâÊÇÒ»¶Î²âÊÔÓï¾ä" +IDS_EDIT, "编辑(&E)" +IDS_DEFAULT, "设为默认值(&D)" +IDS_PROPERTIES, "属性(&P)" +IDS_MARK, "标记(&M)" +IDS_COPY, "复制(&C)" +IDS_PASTE, "粘贴(&P)" +IDS_SELECTALL, "全选(&S)" +IDS_SCROLL, "滚动(&R)" +IDS_SEARCH, "搜索(&E)" +IDS_FNT_DISPLAY, "每个字都是 %ld 个像素宽,%ld 个像素高" +IDS_FNT_PREVIEW_1, "这是一段测试语句" IDS_FNT_PREVIEW_2, "" -IDS_DLG_TIT_DEFAULT, "ÅäÖà - ĬÈÏÉèÖÃ" -IDS_DLG_TIT_CURRENT, "ÅäÖà - µ±Ç°ÉèÖÃ" -IDS_DLG_TIT_ERROR, "ÅäÖôíÎó" -IDS_DLG_ERR_SBWINSIZE, "ÆÁÄ»»º´æ´óС±ØÐë´óÓÚ»òµÈÓÚÊÓ´°»º´æ" +IDS_DLG_TIT_DEFAULT, "配置 - 默认设置" +IDS_DLG_TIT_CURRENT, "配置 - 当前设置" +IDS_DLG_TIT_ERROR, "配置错误" +IDS_DLG_ERR_SBWINSIZE, "屏幕缓存大小必须大于或等于视窗缓存" END IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION " Ñ¡Ïî " +CAPTION " 选项 " FONT 14, "MS Shell Dlg" { - GROUPBOX "¹â±ê³ß´ç", -1, 10, 11, 60, 44, BS_GROUPBOX - AUTORADIOBUTTON "С£¨&S£©", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP - AUTORADIOBUTTON "ÖУ¨&M£©", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP - AUTORADIOBUTTON "´ó£¨&L£©", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP + GROUPBOX "光标尺寸", -1, 10, 11, 60, 44, BS_GROUPBOX + AUTORADIOBUTTON "小(&S)", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP + AUTORADIOBUTTON "中(&M)", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP + AUTORADIOBUTTON "大(&L)", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP - GROUPBOX "¿ØÖÆ", -1, 75, 11, 125, 44, BS_GROUPBOX - LTEXT "µ¯³ö²Ëµ¥", -1, 79, 23, 40, 10 + GROUPBOX "控制", -1, 75, 11, 125, 44, BS_GROUPBOX + LTEXT "弹出菜单", -1, 79, 23, 40, 10 AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 129, 23, 60, 10, WS_TABSTOP AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 129, 33, 60, 10, WS_TABSTOP - LTEXT "¿ìËٱ༭", -1, 79, 43, 50, 10 - AUTOCHECKBOX "ÆôÓã¨&E£©", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP + LTEXT "快速编辑", -1, 79, 43, 50, 10 + AUTOCHECKBOX "启用(&E)", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP - GROUPBOX "ÀúÊ·ÃüÁî", -1, 10, 57, 190, 35, BS_GROUPBOX - LTEXT "×î´ó¼Ç¼ÃüÁîÊý£º", -1, 14, 67, 78, 18 + GROUPBOX "历史命令", -1, 10, 57, 190, 35, BS_GROUPBOX + LTEXT "最大记录命令数:", -1, 14, 67, 78, 18 EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - AUTOCHECKBOX "ɾ³ýÁ¬ÐøÏàͬµÄÃüÁ&R£©", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE + AUTOCHECKBOX "删除连续相同的命令(&R)", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE } IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION " ×ÖÌå " +CAPTION " 字体 " FONT 14, "MS Shell Dlg" { - LTEXT "×ÖÌ壨&F£©", -1, 5, 5, 24, 8 + LTEXT "字体(&F)", -1, 5, 5, 24, 8 LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL - LTEXT "ÑÕÉ«£¨&C£©", -1, 100, 5, 50, 8 + LTEXT "颜色(&C)", -1, 100, 5, 50, 8 CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16 CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16 - LTEXT "´óС£¨&S£©", -1, 158, 5, 40, 8 + LTEXT "大小(&S)", -1, 158, 5, 40, 8 LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40 LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18 @@ -82,27 +86,27 @@ FONT 14, "MS Shell Dlg" IDD_CONFIG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION " ÅäÖà " +CAPTION " 配置 " FONT 14, "MS Shell Dlg" { - GROUPBOX "»º³åÇøÓò", -1, 10, 11, 100, 42, BS_GROUPBOX - LTEXT "¿í¶È£¨&W£©£º", -1, 14, 25, 54, 9 + GROUPBOX "缓冲区域", -1, 10, 11, 100, 42, BS_GROUPBOX + LTEXT "宽度(&W):", -1, 14, 25, 54, 9 EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - LTEXT "¸ß¶È£¨&H£©£º", -1, 14, 39, 54, 9 + LTEXT "高度(&H):", -1, 14, 39, 54, 9 EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - GROUPBOX "´°¿Ú´óС", -1, 10, 55, 100, 42 - LTEXT "¿í¶È£¨&I£©£º", -1, 14, 69, 54, 9 + GROUPBOX "窗口大小", -1, 10, 55, 100, 42 + LTEXT "宽度(&I):", -1, 14, 69, 54, 9 EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - LTEXT "¸ß¶È£¨&E£©£º", -1, 14, 83, 54, 9 + LTEXT "高度(&E):", -1, 14, 83, 54, 9 EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 - GROUPBOX "µ±³ÌÐòÍ˳öºó", -1, 115, 11, 80, 42, BS_GROUPBOX - AUTOCHECKBOX "¹Ø±ÕÐéÄâÖնˣ¨&C£©", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP + GROUPBOX "当程序退出后", -1, 115, 11, 80, 42, BS_GROUPBOX + AUTOCHECKBOX "关闭虚拟终端(&C)", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP GROUPBOX "Edition", -1, 115, 55, 80, 42 COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 75, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP @@ -110,13 +114,118 @@ FONT 14, "MS Shell Dlg" IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 140, 60 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "ÐéÄâÖÕ¶ËÔËÐвÎÊý" +CAPTION "虚拟终端运行参数" FONT 14, "MS Shell Dlg" { GROUPBOX "", -1, 10, 10, 120, 31, BS_GROUPBOX - AUTORADIOBUTTON "±£Áôµ±Ç°ÅäÖÃÒÔ±ãÏ´ÎʹÓÃ", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP - AUTORADIOBUTTON "½öÐ޸ĵ±Ç°»á»°", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP + AUTORADIOBUTTON "保留当前配置以便下次使用", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP + AUTORADIOBUTTON "仅修改当前会话", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP + + PUSHBUTTON "确定", IDOK, 20, 45, 35, 12 + PUSHBUTTON "取消", IDCANCEL, 65, 45, 35, 12 +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE +BEGIN +IDS_EDIT, "編輯(&E)" +IDS_DEFAULT, "設為默認值(&D)" +IDS_PROPERTIES, "屬性(&P)" +IDS_MARK, "標記(&M)" +IDS_COPY, "複製(&C)" +IDS_PASTE, "貼上(&P)" +IDS_SELECTALL, "全選(&S)" +IDS_SCROLL, "滾動(&R)" +IDS_SEARCH, "搜索(&E)" +IDS_FNT_DISPLAY, "每個字都是 %ld 個像素寬,%ld 個像素高" +IDS_FNT_PREVIEW_1, "這是一段測試語句" +IDS_FNT_PREVIEW_2, "" +IDS_DLG_TIT_DEFAULT, "配置 - 默認設定" +IDS_DLG_TIT_CURRENT, "配置 - 當前設定" +IDS_DLG_TIT_ERROR, "配置錯誤" +IDS_DLG_ERR_SBWINSIZE, "螢幕緩存大小必須大於或等於視窗緩存" +END + +IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION " 選項 " +FONT 10, "PMingLiu" +{ + GROUPBOX "游標尺寸", -1, 10, 11, 60, 44, BS_GROUPBOX + AUTORADIOBUTTON "小(&S)", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP + AUTORADIOBUTTON "中(&M)", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP + AUTORADIOBUTTON "大(&L)", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP + + GROUPBOX "控制", -1, 75, 11, 125, 44, BS_GROUPBOX + LTEXT "彈出功能表", -1, 79, 23, 40, 10 + AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 129, 23, 60, 10, WS_TABSTOP + AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 129, 33, 60, 10, WS_TABSTOP + LTEXT "快速編輯", -1, 79, 43, 50, 10 + AUTOCHECKBOX "啟用(&E)", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP - PUSHBUTTON "È·¶¨", IDOK, 20, 45, 35, 12 - PUSHBUTTON "È¡Ïû", IDCANCEL, 65, 45, 35, 12 + GROUPBOX "歷史指令", -1, 10, 57, 190, 35, BS_GROUPBOX + LTEXT "最大記錄指令數:", -1, 14, 67, 78, 18 + EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 + AUTOCHECKBOX "刪除連續相同的指令(&R)", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE } + +IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION " 字型 " +FONT 10, "PMingLiu" +{ + LTEXT "字型(&F)", -1, 5, 5, 24, 8 + LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL + LTEXT "顏色(&C)", -1, 100, 5, 50, 8 + CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16 + CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16 + LTEXT "大小(&S)", -1, 158, 5, 40, 8 + LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL + CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40 + LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18 +} + +IDD_CONFIG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION " 配置 " +FONT 10, "PMingLiu" +{ + GROUPBOX "緩衝區域", -1, 10, 11, 100, 42, BS_GROUPBOX + LTEXT "寬度(&W):", -1, 14, 25, 54, 9 + EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 + LTEXT "高度(&H):", -1, 14, 39, 54, 9 + EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 + + GROUPBOX "窗口大小", -1, 10, 55, 100, 42 + LTEXT "寬度(&I):", -1, 14, 69, 54, 9 + EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 + LTEXT "高度(&E):", -1, 14, 83, 54, 9 + EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER + CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0 + + GROUPBOX "當程式結束後", -1, 115, 11, 80, 42, BS_GROUPBOX + AUTOCHECKBOX "關閉虛擬終端(&C)", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP + + GROUPBOX "Edition", -1, 115, 55, 80, 42 + COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 75, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP +} + +IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 140, 60 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "虛擬終端執行參數" +FONT 10, "PMingLiu" +{ + GROUPBOX "", -1, 10, 10, 120, 31, BS_GROUPBOX + AUTORADIOBUTTON "保留當前配置以便下次使用", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP + AUTORADIOBUTTON "僅修改當前會話", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP + + PUSHBUTTON "確定", IDOK, 20, 45, 35, 12 + PUSHBUTTON "取消", IDCANCEL, 65, 45, 35, 12 +} + +#pragma code_page(default) diff --git a/programs/winefile/Zh.rc b/programs/winefile/Zh.rc dissimilarity index 70% index 76fa36051b5..53955c10c92 100644 --- a/programs/winefile/Zh.rc +++ b/programs/winefile/Zh.rc @@ -1,158 +1,302 @@ -/* - * WineFile - * Simplified Chinese Language Support - * - * Copyright 2002 liuspider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED - -/* Menu */ - -IDM_WINEFILE MENU FIXED IMPURE -{ - POPUP "Îļþ£¨&F£©" { - MENUITEM "´ò¿ª£¨&O£©\tEnter", ID_ACTIVATE - MENUITEM "Òƶ¯£¨&M£©...\tF7", ID_FILE_MOVE - MENUITEM "¸´ÖÆ£¨&C£©...\tF8", ID_FILE_COPY - MENUITEM "λÓÚ¼ôÌù°å£¨&I£©...\tF9", 118 - MENUITEM "ɾ³ý£¨&D£©\tDel", ID_FILE_DELETE - MENUITEM "¸ÄÃû£¨&N£©...", 109 - MENUITEM "ÊôÐÔ£¨&I£©...\tAlt+Enter", ID_EDIT_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "ѹËõ£¨&O£©...", 119 - MENUITEM "½âѹËõ£¨&O£©...", 120 - MENUITEM SEPARATOR - MENUITEM "ÔËÐУ¨&R£©...", ID_EXECUTE - MENUITEM "´òÓ¡£¨&P£©...", 102 - MENUITEM "ÅäÖÃÎļþÏà¹Ø...", 103 - MENUITEM SEPARATOR - MENUITEM "½¨Á¢Ä¿Â¼£¨&E£©...", 111 - MENUITEM "²éÕÒ£¨&H£©...", 104 - MENUITEM "Ñ¡ÔñÎļþ£¨&S£©...", 116 - MENUITEM SEPARATOR -#ifndef _NO_EXTENSIONS - MENUITEM "Í˳ö£¨&X£©\tAlt+X", ID_FILE_EXIT -#else - MENUITEM "Í˳ö£¨&X£©", ID_FILE_EXIT -#endif - } - - POPUP "´ÅÅÌ£¨&D£©" { - MENUITEM "¸´ÖÆ£¨&C£©...", 201 - MENUITEM "ÃüÃû£¨&L£©...", 202 - MENUITEM SEPARATOR - MENUITEM "¸ñʽ»¯£¨&£©...", ID_FORMAT_DISK -#ifdef _WIN95 - MENUITEM "½¨Á¢ÏµÍ³ÅÌ£¨&M£©...", -1 /*TODO*/ -#endif - MENUITEM SEPARATOR - MENUITEM "Á¬½ÓÍøÂçÇý¶¯Æ÷£¨&N£©", ID_CONNECT_NETWORK_DRIVE - MENUITEM "¶Ï¿ªÍøÂçÇý¶¯Æ÷Á¬½Ó£¨&D£©", ID_DISCONNECT_NETWORK_DRIVE - MENUITEM SEPARATOR - MENUITEM "¹²ÏíΪ...", 254 - MENUITEM "ɾ³ý¹²Ïí£¨&R£©...", 255 - MENUITEM SEPARATOR - MENUITEM "Ñ¡ÔñÇý¶¯Æ÷£¨&S£©...", 251 - } - - POPUP "Ŀ¼£¨&D£©" { - MENUITEM "ÏÂÒ»²ã£¨&N£©\t+", 301 - MENUITEM "Õ¹¿ª£¨&T£©\t*", 302 - MENUITEM "È«²¿Õ¹¿ª£¨&A£©\tStrg+*", 303 - MENUITEM "ÕÛµþ£¨&R£©\t-", 304 - MENUITEM SEPARATOR - MENUITEM "±ê¼Ç×ÓĿ¼£¨&M£©", 505 - } - - POPUP "ÊÓͼ£¨&V£©" { - MENUITEM "Ŀ¼Ê÷»úÆ÷ÄÚÈÝ£¨&R£©", 413 - MENUITEM "½öÏÔʾĿ¼Ê÷£¨&E£©", 411 - MENUITEM "½öÏÔʾĿ¼ÄÚÈÝ£¨&O£©", 412 - MENUITEM SEPARATOR - MENUITEM "·Ö¸î£¨&L£©", ID_VIEW_SPLIT - MENUITEM SEPARATOR - MENUITEM "ÎļþÃûÃû£¨&N£©", ID_VIEW_NAME - MENUITEM "ÎļþÏêϤÁÐ±í£¨&A£©", ID_VIEW_ALL_ATTRIBUTES, CHECKED - MENUITEM "²¿·ÖÊôÐÔ£¨&P£©...", ID_VIEW_SELECTED_ATTRIBUTES - MENUITEM SEPARATOR - MENUITEM "°´ÎļþÃûÅÅÐò£¨&S£©", ID_VIEW_SORT_NAME - MENUITEM "°´ÀàÐÍÅÅÐò£¨&B£©", ID_VIEW_SORT_TYPE - MENUITEM "°´´óСÅÅÐò£¨&Z£©", ID_VIEW_SORT_SIZE - MENUITEM "°´ÈÕÆÚÅÅÐò£¨&D£©", ID_VIEW_SORT_DATE - MENUITEM SEPARATOR - MENUITEM "¶¨ÖÆÅÅÐò...", ID_VIEW_FILTER - } - - POPUP "Ñ¡Ï&O£©" { - MENUITEM "È·¶¨·½Ê½£¨&C£©...", 501 - MENUITEM "×ÖÌ壨&F£©...", ID_SELECT_FONT - MENUITEM "¶¨Öƹ¤¾ßÌõ£¨&B£©...", 512 - MENUITEM SEPARATOR - MENUITEM "¹¤¾ßÌõ£¨&T£©", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "Çý¶¯Æ÷ÁÐ±í£¨&D£©", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "״̬À¸£¨&S£©", ID_VIEW_STATUSBAR, CHECKED -#ifndef _NO_EXTENSIONS - MENUITEM "È«ÆÁ£¨&U£©\tCtrl+Shift+S", ID_VIEW_FULLSCREEN -#endif - MENUITEM SEPARATOR - MENUITEM "Æô¶¯ºó×îС»¯£¨&M£©", 504 - MENUITEM "Í˳öʱ±£´æÉèÖã¨&S£©", 511 - } - - - POPUP "°²È«£¨&S£©" { - MENUITEM "·ÃÎÊ£¨&A£©...", 605 - MENUITEM "µÇ¼£¨&L£©...", 606 - MENUITEM "ËùÓÐÕߣ¨&O£©...", 607 - } - - POPUP "´°¿Ú£¨&W£©" { - MENUITEM "н¨£¨&W)", ID_WINDOW_NEW - MENUITEM "²ãµþ\tCtrl+F5", ID_WINDOW_CASCADE - MENUITEM "ˮƽƽÆÌ£¨&H£©", ID_WINDOW_TILE_HORZ - MENUITEM "´¹Ö±Æ½ÆÌ£¨&£©\tCtrl+F4", ID_WINDOW_TILE_VERT -#ifndef _NO_EXTENSIONS - MENUITEM "×Ô¶¯ÅÅÁÐ", ID_WINDOW_AUTOSORT -#endif - MENUITEM "×Ô¶¯ÅÅÁÐͼ±ê£¨&S£©", ID_WINDOW_ARRANGE - MENUITEM "ˢУ¨&R£©\tF5", ID_REFRESH - } - - POPUP "&?" { - MENUITEM "°ïÖúÖ÷Ì⣨&H£©\tF1", ID_HELP - MENUITEM "ËÑË÷°ïÖú£¨&S£©...\tF1", ID_HELP - MENUITEM "ʹÓðïÖú£¨&U£©\tF1", ID_HELP_USING - MENUITEM SEPARATOR - MENUITEM "&¹ØÓÚ Winefile...", ID_ABOUT - } -} - - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ÔËÐÐ" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "ÃüÁ&C£©£º", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "×÷ΪÁ¬½Ó£¨&S£©", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "È·¶¨", 1, 158, 6, 47, 14 - PUSHBUTTON "È¡Ïû", 2, 158, 23, 47, 14 - PUSHBUTTON "°ïÖú£¨&H£©", 254, 158, 43, 47, 14 -} +/* + * WineFile + * Simplified and Traditional Chinese Language Support + * + * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "文件(&F)" { + MENUITEM "打开(&O)\tEnter", ID_ACTIVATE + MENUITEM "移动(&M)...\tF7", ID_FILE_MOVE + MENUITEM "复制(&C)...\tF8", ID_FILE_COPY + MENUITEM "位于剪贴板(&I)...\tF9", 118 + MENUITEM "删除(&D)\tDel", ID_FILE_DELETE + MENUITEM "改名(&N)...", 109 + MENUITEM "属性(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "压缩(&O)...", 119 + MENUITEM "解压缩(&O)...", 120 + MENUITEM SEPARATOR + MENUITEM "运行(&R)...", ID_EXECUTE + MENUITEM "打印(&P)...", 102 + MENUITEM "配置文件相关...", 103 + MENUITEM SEPARATOR + MENUITEM "建立目录(&E)...", 111 + MENUITEM "查找(&H)...", 104 + MENUITEM "选择文件(&S)...", 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "退出(&X)\tAlt+X", ID_FILE_EXIT +#else + MENUITEM "退出(&X)", ID_FILE_EXIT +#endif + } + + POPUP "磁盘(&D)" { + MENUITEM "复制(&C)...", 201 + MENUITEM "命名(&L)...", 202 + MENUITEM SEPARATOR + MENUITEM "格式化(&)...", ID_FORMAT_DISK +#ifdef _WIN95 + MENUITEM "建立系统盘(&M)...", -1 /*TODO*/ +#endif + MENUITEM SEPARATOR + MENUITEM "连接网络驱动器(&N)", ID_CONNECT_NETWORK_DRIVE + MENUITEM "断开网络驱动器连接(&D)", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM SEPARATOR + MENUITEM "共享为...", 254 + MENUITEM "删除共享(&R)...", 255 + MENUITEM SEPARATOR + MENUITEM "选择驱动器(&S)...", 251 + } + + POPUP "目录(&D)" { + MENUITEM "下一层(&N)\t+", 301 + MENUITEM "展开(&T)\t*", 302 + MENUITEM "全部展开(&A)\tStrg+*", 303 + MENUITEM "折叠(&R)\t-", 304 + MENUITEM SEPARATOR + MENUITEM "标记子目录(&M)", 505 + } + + POPUP "视图(&V)" { + MENUITEM "目录树机器内容(&R)", 413 + MENUITEM "仅显示目录树(&E)", 411 + MENUITEM "仅显示目录内容(&O)", 412 + MENUITEM SEPARATOR + MENUITEM "分割(&L)", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "文件名称(&N)", ID_VIEW_NAME + MENUITEM "文件详情列表(&A)", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "部分属性(&P)...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "按文件名排序(&S)", ID_VIEW_SORT_NAME + MENUITEM "按类型排序(&B)", ID_VIEW_SORT_TYPE + MENUITEM "按大小排序(&Z)", ID_VIEW_SORT_SIZE + MENUITEM "按日期排序(&D)", ID_VIEW_SORT_DATE + MENUITEM SEPARATOR + MENUITEM "定制排序...", ID_VIEW_FILTER + } + + POPUP "选项(&O)" { + MENUITEM "确定方式(&C)...", 501 + MENUITEM "字体(&F)...", ID_SELECT_FONT + MENUITEM "定制工具条(&B)...", 512 + MENUITEM SEPARATOR + MENUITEM "工具条(&T)", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "驱动器列表(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "状态栏(&S)", ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "全屏(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "启动后最小化(&M)", 504 + MENUITEM "退出时保存设置(&S)", 511 + } + + + POPUP "安全(&S)" { + MENUITEM "访问(&A)...", 605 + MENUITEM "登录(&L)...", 606 + MENUITEM "所有者(&O)...", 607 + } + + POPUP "窗口(&W)" { + MENUITEM "新建(&W)", ID_WINDOW_NEW + MENUITEM "层叠\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "水平平铺(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "垂直平铺(&)\tCtrl+F4", ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "自动排列", ID_WINDOW_AUTOSORT +#endif + MENUITEM "自动排列图标(&S)", ID_WINDOW_ARRANGE + MENUITEM "刷新(&R)\tF5", ID_REFRESH + } + + POPUP "&?" { + MENUITEM "帮助主题(&H)\tF1", ID_HELP + MENUITEM "搜索帮助(&S)...\tF1", ID_HELP + MENUITEM "使用帮助(&U)\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "&关于 Winefile...", ID_ABOUT + } +} + + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "运行" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "命令(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + CONTROL "作为连接(&S)", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + DEFPUSHBUTTON "确定", 1, 158, 6, 47, 14 + PUSHBUTTON "取消", 2, 158, 23, 47, 14 + PUSHBUTTON "帮助(&H)", 254, 158, 43, 47, 14 +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "檔案(&F)" { + MENUITEM "開啟(&O)\tEnter", ID_ACTIVATE + MENUITEM "移動(&M)...\tF7", ID_FILE_MOVE + MENUITEM "複製(&C)...\tF8", ID_FILE_COPY + MENUITEM "位於剪貼板(&I)...\tF9", 118 + MENUITEM "刪除(&D)\tDel", ID_FILE_DELETE + MENUITEM "改名(&N)...", 109 + MENUITEM "屬性(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "壓縮(&O)...", 119 + MENUITEM "解壓縮(&O)...", 120 + MENUITEM SEPARATOR + MENUITEM "執行(&R)...", ID_EXECUTE + MENUITEM "列印(&P)...", 102 + MENUITEM "配置檔案相關...", 103 + MENUITEM SEPARATOR + MENUITEM "建立目錄(&E)...", 111 + MENUITEM "查找(&H)...", 104 + MENUITEM "選擇檔案(&S)...", 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "結束(&X)\tAlt+X", ID_FILE_EXIT +#else + MENUITEM "結束(&X)", ID_FILE_EXIT +#endif + } + + POPUP "磁盤(&D)" { + MENUITEM "複製(&C)...", 201 + MENUITEM "命名(&L)...", 202 + MENUITEM SEPARATOR + MENUITEM "格式化(&)...", ID_FORMAT_DISK +#ifdef _WIN95 + MENUITEM "建立系統盤(&M)...", -1 /*TODO*/ +#endif + MENUITEM SEPARATOR + MENUITEM "連接網路儲存槽(&N)", ID_CONNECT_NETWORK_DRIVE + MENUITEM "斷開網路儲存槽連接(&D)", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM SEPARATOR + MENUITEM "共享為...", 254 + MENUITEM "刪除共享(&R)...", 255 + MENUITEM SEPARATOR + MENUITEM "選擇儲存槽(&S)...", 251 + } + + POPUP "目錄(&D)" { + MENUITEM "下一層(&N)\t+", 301 + MENUITEM "展開(&T)\t*", 302 + MENUITEM "全部展開(&A)\tStrg+*", 303 + MENUITEM "折疊(&R)\t-", 304 + MENUITEM SEPARATOR + MENUITEM "標記子目錄(&M)", 505 + } + + POPUP "檢視(&V)" { + MENUITEM "目錄樹機器內容(&R)", 413 + MENUITEM "僅顯示目錄樹(&E)", 411 + MENUITEM "僅顯示目錄內容(&O)", 412 + MENUITEM SEPARATOR + MENUITEM "分割(&L)", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "檔案名稱(&N)", ID_VIEW_NAME + MENUITEM "檔案詳情列表(&A)", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "部分屬性(&P)...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "按檔案名排列(&S)", ID_VIEW_SORT_NAME + MENUITEM "按類型排列(&B)", ID_VIEW_SORT_TYPE + MENUITEM "按大小排列(&Z)", ID_VIEW_SORT_SIZE + MENUITEM "按日期排列(&D)", ID_VIEW_SORT_DATE + MENUITEM SEPARATOR + MENUITEM "定製排列...", ID_VIEW_FILTER + } + + POPUP "選項(&O)" { + MENUITEM "確定方式(&C)...", 501 + MENUITEM "字型(&F)...", ID_SELECT_FONT + MENUITEM "定製工具條(&B)...", 512 + MENUITEM SEPARATOR + MENUITEM "工具條(&T)", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "儲存槽列表(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "狀態欄(&S)", ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "全屏(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "啟動後最小化(&M)", 504 + MENUITEM "結束時儲存設定(&S)", 511 + } + + + POPUP "安全(&S)" { + MENUITEM "訪問(&A)...", 605 + MENUITEM "登錄(&L)...", 606 + MENUITEM "所有者(&O)...", 607 + } + + POPUP "窗口(&W)" { + MENUITEM "新建(&W)", ID_WINDOW_NEW + MENUITEM "層疊\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "水平平鋪(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "垂直平鋪(&)\tCtrl+F4", ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "自動排列", ID_WINDOW_AUTOSORT +#endif + MENUITEM "自動排列圖標(&S)", ID_WINDOW_ARRANGE + MENUITEM "刷新(&R)\tF5", ID_REFRESH + } + + POPUP "&?" { + MENUITEM "幫助主題(&H)\tF1", ID_HELP + MENUITEM "搜索幫助(&S)...\tF1", ID_HELP + MENUITEM "使用幫助(&U)\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "&關於 Winefile...", ID_ABOUT + } +} + + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "執行" +FONT 8, "PMingLiu" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "指令(&C):", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + CONTROL "作為連接(&S)", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + DEFPUSHBUTTON "確定", 1, 158, 6, 47, 14 + PUSHBUTTON "取消", 2, 158, 23, 47, 14 + PUSHBUTTON "幫助(&H)", 254, 158, 43, 47, 14 +} + +#pragma code_page(default) diff --git a/programs/winetest/Makefile.in b/programs/winetest/Makefile.in dissimilarity index 92% index 2c06b1194eb..d153c047bee 100644 --- a/programs/winetest/Makefile.in +++ b/programs/winetest/Makefile.in @@ -1,308 +1,61 @@ -TOPSRCDIR = @top_srcdir@ -TOPOBJDIR = ../.. -SRCDIR = @srcdir@ -VPATH = @srcdir@ -MODULE = winetest.exe -APPMODE = -mconsole -IMPORTS = comctl32 version user32 gdi32 advapi32 wsock32 kernel32 - -EXTRARCFLAGS = -DBUILD_SHA1=\"`GIT_DIR=$(TOPSRCDIR)/.git git rev-parse HEAD 2>/dev/null`\" - -C_SRCS = \ - gui.c \ - main.c \ - send.c \ - util.c - -RC_SRCS = \ - winetest.rc - -SVG_SRCS = winetest.svg - -@MAKE_PROG_RULES@ - -# List of test executables (auto-generated by make_makefiles) - -TESTBINS = \ - advapi32_test.exe \ - advpack_test.exe \ - browseui_test.exe \ - cabinet_test.exe \ - comcat_test.exe \ - comctl32_test.exe \ - comdlg32_test.exe \ - credui_test.exe \ - crypt32_test.exe \ - cryptnet_test.exe \ - d3d8_test.exe \ - d3d9_test.exe \ - d3drm_test.exe \ - d3dx8_test.exe \ - d3dx9_36_test.exe \ - d3dxof_test.exe \ - ddraw_test.exe \ - dinput_test.exe \ - dnsapi_test.exe \ - dplayx_test.exe \ - dsound_test.exe \ - fusion_test.exe \ - gdi32_test.exe \ - gdiplus_test.exe \ - hlink_test.exe \ - imm32_test.exe \ - inetcomm_test.exe \ - inetmib1_test.exe \ - infosoft_test.exe \ - iphlpapi_test.exe \ - itss_test.exe \ - jscript_test.exe \ - kernel32_test.exe \ - localspl_test.exe \ - localui_test.exe \ - lz32_test.exe \ - mapi32_test.exe \ - mlang_test.exe \ - msacm32_test.exe \ - mscms_test.exe \ - mshtml_test.exe \ - msi_test.exe \ - mstask_test.exe \ - msvcrt_test.exe \ - msvcrtd_test.exe \ - msxml3_test.exe \ - netapi32_test.exe \ - ntdll_test.exe \ - ntdsapi_test.exe \ - ntprint_test.exe \ - odbccp32_test.exe \ - ole32_test.exe \ - oleaut32_test.exe \ - opengl32_test.exe \ - pdh_test.exe \ - psapi_test.exe \ - qedit_test.exe \ - qmgr_test.exe \ - quartz_test.exe \ - rasapi32_test.exe \ - riched20_test.exe \ - riched32_test.exe \ - rpcrt4_test.exe \ - rsaenh_test.exe \ - schannel_test.exe \ - secur32_test.exe \ - serialui_test.exe \ - setupapi_test.exe \ - shdocvw_test.exe \ - shell32_test.exe \ - shlwapi_test.exe \ - snmpapi_test.exe \ - spoolss_test.exe \ - urlmon_test.exe \ - user32_test.exe \ - userenv_test.exe \ - usp10_test.exe \ - uxtheme_test.exe \ - version_test.exe \ - winhttp_test.exe \ - wininet_test.exe \ - winmm_test.exe \ - winspool.drv_test.exe \ - wintrust_test.exe \ - ws2_32_test.exe - -advapi32_test.exe: $(DLLDIR)/advapi32/tests/advapi32_test.exe$(DLLEXT) - cp $(DLLDIR)/advapi32/tests/advapi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -advpack_test.exe: $(DLLDIR)/advpack/tests/advpack_test.exe$(DLLEXT) - cp $(DLLDIR)/advpack/tests/advpack_test.exe$(DLLEXT) $@ && $(STRIP) $@ -browseui_test.exe: $(DLLDIR)/browseui/tests/browseui_test.exe$(DLLEXT) - cp $(DLLDIR)/browseui/tests/browseui_test.exe$(DLLEXT) $@ && $(STRIP) $@ -cabinet_test.exe: $(DLLDIR)/cabinet/tests/cabinet_test.exe$(DLLEXT) - cp $(DLLDIR)/cabinet/tests/cabinet_test.exe$(DLLEXT) $@ && $(STRIP) $@ -comcat_test.exe: $(DLLDIR)/comcat/tests/comcat_test.exe$(DLLEXT) - cp $(DLLDIR)/comcat/tests/comcat_test.exe$(DLLEXT) $@ && $(STRIP) $@ -comctl32_test.exe: $(DLLDIR)/comctl32/tests/comctl32_test.exe$(DLLEXT) - cp $(DLLDIR)/comctl32/tests/comctl32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -comdlg32_test.exe: $(DLLDIR)/comdlg32/tests/comdlg32_test.exe$(DLLEXT) - cp $(DLLDIR)/comdlg32/tests/comdlg32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -credui_test.exe: $(DLLDIR)/credui/tests/credui_test.exe$(DLLEXT) - cp $(DLLDIR)/credui/tests/credui_test.exe$(DLLEXT) $@ && $(STRIP) $@ -crypt32_test.exe: $(DLLDIR)/crypt32/tests/crypt32_test.exe$(DLLEXT) - cp $(DLLDIR)/crypt32/tests/crypt32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -cryptnet_test.exe: $(DLLDIR)/cryptnet/tests/cryptnet_test.exe$(DLLEXT) - cp $(DLLDIR)/cryptnet/tests/cryptnet_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3d8_test.exe: $(DLLDIR)/d3d8/tests/d3d8_test.exe$(DLLEXT) - cp $(DLLDIR)/d3d8/tests/d3d8_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3d9_test.exe: $(DLLDIR)/d3d9/tests/d3d9_test.exe$(DLLEXT) - cp $(DLLDIR)/d3d9/tests/d3d9_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3drm_test.exe: $(DLLDIR)/d3drm/tests/d3drm_test.exe$(DLLEXT) - cp $(DLLDIR)/d3drm/tests/d3drm_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3dx8_test.exe: $(DLLDIR)/d3dx8/tests/d3dx8_test.exe$(DLLEXT) - cp $(DLLDIR)/d3dx8/tests/d3dx8_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3dx9_36_test.exe: $(DLLDIR)/d3dx9_36/tests/d3dx9_36_test.exe$(DLLEXT) - cp $(DLLDIR)/d3dx9_36/tests/d3dx9_36_test.exe$(DLLEXT) $@ && $(STRIP) $@ -d3dxof_test.exe: $(DLLDIR)/d3dxof/tests/d3dxof_test.exe$(DLLEXT) - cp $(DLLDIR)/d3dxof/tests/d3dxof_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ddraw_test.exe: $(DLLDIR)/ddraw/tests/ddraw_test.exe$(DLLEXT) - cp $(DLLDIR)/ddraw/tests/ddraw_test.exe$(DLLEXT) $@ && $(STRIP) $@ -dinput_test.exe: $(DLLDIR)/dinput/tests/dinput_test.exe$(DLLEXT) - cp $(DLLDIR)/dinput/tests/dinput_test.exe$(DLLEXT) $@ && $(STRIP) $@ -dnsapi_test.exe: $(DLLDIR)/dnsapi/tests/dnsapi_test.exe$(DLLEXT) - cp $(DLLDIR)/dnsapi/tests/dnsapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -dplayx_test.exe: $(DLLDIR)/dplayx/tests/dplayx_test.exe$(DLLEXT) - cp $(DLLDIR)/dplayx/tests/dplayx_test.exe$(DLLEXT) $@ && $(STRIP) $@ -dsound_test.exe: $(DLLDIR)/dsound/tests/dsound_test.exe$(DLLEXT) - cp $(DLLDIR)/dsound/tests/dsound_test.exe$(DLLEXT) $@ && $(STRIP) $@ -fusion_test.exe: $(DLLDIR)/fusion/tests/fusion_test.exe$(DLLEXT) - cp $(DLLDIR)/fusion/tests/fusion_test.exe$(DLLEXT) $@ && $(STRIP) $@ -gdi32_test.exe: $(DLLDIR)/gdi32/tests/gdi32_test.exe$(DLLEXT) - cp $(DLLDIR)/gdi32/tests/gdi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -gdiplus_test.exe: $(DLLDIR)/gdiplus/tests/gdiplus_test.exe$(DLLEXT) - cp $(DLLDIR)/gdiplus/tests/gdiplus_test.exe$(DLLEXT) $@ && $(STRIP) $@ -hlink_test.exe: $(DLLDIR)/hlink/tests/hlink_test.exe$(DLLEXT) - cp $(DLLDIR)/hlink/tests/hlink_test.exe$(DLLEXT) $@ && $(STRIP) $@ -imm32_test.exe: $(DLLDIR)/imm32/tests/imm32_test.exe$(DLLEXT) - cp $(DLLDIR)/imm32/tests/imm32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -inetcomm_test.exe: $(DLLDIR)/inetcomm/tests/inetcomm_test.exe$(DLLEXT) - cp $(DLLDIR)/inetcomm/tests/inetcomm_test.exe$(DLLEXT) $@ && $(STRIP) $@ -inetmib1_test.exe: $(DLLDIR)/inetmib1/tests/inetmib1_test.exe$(DLLEXT) - cp $(DLLDIR)/inetmib1/tests/inetmib1_test.exe$(DLLEXT) $@ && $(STRIP) $@ -infosoft_test.exe: $(DLLDIR)/infosoft/tests/infosoft_test.exe$(DLLEXT) - cp $(DLLDIR)/infosoft/tests/infosoft_test.exe$(DLLEXT) $@ && $(STRIP) $@ -iphlpapi_test.exe: $(DLLDIR)/iphlpapi/tests/iphlpapi_test.exe$(DLLEXT) - cp $(DLLDIR)/iphlpapi/tests/iphlpapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -itss_test.exe: $(DLLDIR)/itss/tests/itss_test.exe$(DLLEXT) - cp $(DLLDIR)/itss/tests/itss_test.exe$(DLLEXT) $@ && $(STRIP) $@ -jscript_test.exe: $(DLLDIR)/jscript/tests/jscript_test.exe$(DLLEXT) - cp $(DLLDIR)/jscript/tests/jscript_test.exe$(DLLEXT) $@ && $(STRIP) $@ -kernel32_test.exe: $(DLLDIR)/kernel32/tests/kernel32_test.exe$(DLLEXT) - cp $(DLLDIR)/kernel32/tests/kernel32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -localspl_test.exe: $(DLLDIR)/localspl/tests/localspl_test.exe$(DLLEXT) - cp $(DLLDIR)/localspl/tests/localspl_test.exe$(DLLEXT) $@ && $(STRIP) $@ -localui_test.exe: $(DLLDIR)/localui/tests/localui_test.exe$(DLLEXT) - cp $(DLLDIR)/localui/tests/localui_test.exe$(DLLEXT) $@ && $(STRIP) $@ -lz32_test.exe: $(DLLDIR)/lz32/tests/lz32_test.exe$(DLLEXT) - cp $(DLLDIR)/lz32/tests/lz32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -mapi32_test.exe: $(DLLDIR)/mapi32/tests/mapi32_test.exe$(DLLEXT) - cp $(DLLDIR)/mapi32/tests/mapi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -mlang_test.exe: $(DLLDIR)/mlang/tests/mlang_test.exe$(DLLEXT) - cp $(DLLDIR)/mlang/tests/mlang_test.exe$(DLLEXT) $@ && $(STRIP) $@ -msacm32_test.exe: $(DLLDIR)/msacm32/tests/msacm32_test.exe$(DLLEXT) - cp $(DLLDIR)/msacm32/tests/msacm32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -mscms_test.exe: $(DLLDIR)/mscms/tests/mscms_test.exe$(DLLEXT) - cp $(DLLDIR)/mscms/tests/mscms_test.exe$(DLLEXT) $@ && $(STRIP) $@ -mshtml_test.exe: $(DLLDIR)/mshtml/tests/mshtml_test.exe$(DLLEXT) - cp $(DLLDIR)/mshtml/tests/mshtml_test.exe$(DLLEXT) $@ && $(STRIP) $@ -msi_test.exe: $(DLLDIR)/msi/tests/msi_test.exe$(DLLEXT) - cp $(DLLDIR)/msi/tests/msi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -mstask_test.exe: $(DLLDIR)/mstask/tests/mstask_test.exe$(DLLEXT) - cp $(DLLDIR)/mstask/tests/mstask_test.exe$(DLLEXT) $@ && $(STRIP) $@ -msvcrt_test.exe: $(DLLDIR)/msvcrt/tests/msvcrt_test.exe$(DLLEXT) - cp $(DLLDIR)/msvcrt/tests/msvcrt_test.exe$(DLLEXT) $@ && $(STRIP) $@ -msvcrtd_test.exe: $(DLLDIR)/msvcrtd/tests/msvcrtd_test.exe$(DLLEXT) - cp $(DLLDIR)/msvcrtd/tests/msvcrtd_test.exe$(DLLEXT) $@ && $(STRIP) $@ -msxml3_test.exe: $(DLLDIR)/msxml3/tests/msxml3_test.exe$(DLLEXT) - cp $(DLLDIR)/msxml3/tests/msxml3_test.exe$(DLLEXT) $@ && $(STRIP) $@ -netapi32_test.exe: $(DLLDIR)/netapi32/tests/netapi32_test.exe$(DLLEXT) - cp $(DLLDIR)/netapi32/tests/netapi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ntdll_test.exe: $(DLLDIR)/ntdll/tests/ntdll_test.exe$(DLLEXT) - cp $(DLLDIR)/ntdll/tests/ntdll_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ntdsapi_test.exe: $(DLLDIR)/ntdsapi/tests/ntdsapi_test.exe$(DLLEXT) - cp $(DLLDIR)/ntdsapi/tests/ntdsapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ntprint_test.exe: $(DLLDIR)/ntprint/tests/ntprint_test.exe$(DLLEXT) - cp $(DLLDIR)/ntprint/tests/ntprint_test.exe$(DLLEXT) $@ && $(STRIP) $@ -odbccp32_test.exe: $(DLLDIR)/odbccp32/tests/odbccp32_test.exe$(DLLEXT) - cp $(DLLDIR)/odbccp32/tests/odbccp32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ole32_test.exe: $(DLLDIR)/ole32/tests/ole32_test.exe$(DLLEXT) - cp $(DLLDIR)/ole32/tests/ole32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -oleaut32_test.exe: $(DLLDIR)/oleaut32/tests/oleaut32_test.exe$(DLLEXT) - cp $(DLLDIR)/oleaut32/tests/oleaut32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -opengl32_test.exe: $(DLLDIR)/opengl32/tests/opengl32_test.exe$(DLLEXT) - cp $(DLLDIR)/opengl32/tests/opengl32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -pdh_test.exe: $(DLLDIR)/pdh/tests/pdh_test.exe$(DLLEXT) - cp $(DLLDIR)/pdh/tests/pdh_test.exe$(DLLEXT) $@ && $(STRIP) $@ -psapi_test.exe: $(DLLDIR)/psapi/tests/psapi_test.exe$(DLLEXT) - cp $(DLLDIR)/psapi/tests/psapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -qedit_test.exe: $(DLLDIR)/qedit/tests/qedit_test.exe$(DLLEXT) - cp $(DLLDIR)/qedit/tests/qedit_test.exe$(DLLEXT) $@ && $(STRIP) $@ -qmgr_test.exe: $(DLLDIR)/qmgr/tests/qmgr_test.exe$(DLLEXT) - cp $(DLLDIR)/qmgr/tests/qmgr_test.exe$(DLLEXT) $@ && $(STRIP) $@ -quartz_test.exe: $(DLLDIR)/quartz/tests/quartz_test.exe$(DLLEXT) - cp $(DLLDIR)/quartz/tests/quartz_test.exe$(DLLEXT) $@ && $(STRIP) $@ -rasapi32_test.exe: $(DLLDIR)/rasapi32/tests/rasapi32_test.exe$(DLLEXT) - cp $(DLLDIR)/rasapi32/tests/rasapi32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -riched20_test.exe: $(DLLDIR)/riched20/tests/riched20_test.exe$(DLLEXT) - cp $(DLLDIR)/riched20/tests/riched20_test.exe$(DLLEXT) $@ && $(STRIP) $@ -riched32_test.exe: $(DLLDIR)/riched32/tests/riched32_test.exe$(DLLEXT) - cp $(DLLDIR)/riched32/tests/riched32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -rpcrt4_test.exe: $(DLLDIR)/rpcrt4/tests/rpcrt4_test.exe$(DLLEXT) - cp $(DLLDIR)/rpcrt4/tests/rpcrt4_test.exe$(DLLEXT) $@ && $(STRIP) $@ -rsaenh_test.exe: $(DLLDIR)/rsaenh/tests/rsaenh_test.exe$(DLLEXT) - cp $(DLLDIR)/rsaenh/tests/rsaenh_test.exe$(DLLEXT) $@ && $(STRIP) $@ -schannel_test.exe: $(DLLDIR)/schannel/tests/schannel_test.exe$(DLLEXT) - cp $(DLLDIR)/schannel/tests/schannel_test.exe$(DLLEXT) $@ && $(STRIP) $@ -secur32_test.exe: $(DLLDIR)/secur32/tests/secur32_test.exe$(DLLEXT) - cp $(DLLDIR)/secur32/tests/secur32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -serialui_test.exe: $(DLLDIR)/serialui/tests/serialui_test.exe$(DLLEXT) - cp $(DLLDIR)/serialui/tests/serialui_test.exe$(DLLEXT) $@ && $(STRIP) $@ -setupapi_test.exe: $(DLLDIR)/setupapi/tests/setupapi_test.exe$(DLLEXT) - cp $(DLLDIR)/setupapi/tests/setupapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -shdocvw_test.exe: $(DLLDIR)/shdocvw/tests/shdocvw_test.exe$(DLLEXT) - cp $(DLLDIR)/shdocvw/tests/shdocvw_test.exe$(DLLEXT) $@ && $(STRIP) $@ -shell32_test.exe: $(DLLDIR)/shell32/tests/shell32_test.exe$(DLLEXT) - cp $(DLLDIR)/shell32/tests/shell32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -shlwapi_test.exe: $(DLLDIR)/shlwapi/tests/shlwapi_test.exe$(DLLEXT) - cp $(DLLDIR)/shlwapi/tests/shlwapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -snmpapi_test.exe: $(DLLDIR)/snmpapi/tests/snmpapi_test.exe$(DLLEXT) - cp $(DLLDIR)/snmpapi/tests/snmpapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ -spoolss_test.exe: $(DLLDIR)/spoolss/tests/spoolss_test.exe$(DLLEXT) - cp $(DLLDIR)/spoolss/tests/spoolss_test.exe$(DLLEXT) $@ && $(STRIP) $@ -urlmon_test.exe: $(DLLDIR)/urlmon/tests/urlmon_test.exe$(DLLEXT) - cp $(DLLDIR)/urlmon/tests/urlmon_test.exe$(DLLEXT) $@ && $(STRIP) $@ -user32_test.exe: $(DLLDIR)/user32/tests/user32_test.exe$(DLLEXT) - cp $(DLLDIR)/user32/tests/user32_test.exe$(DLLEXT) $@ && $(STRIP) $@ -userenv_test.exe: $(DLLDIR)/userenv/tests/userenv_test.exe$(DLLEXT) - cp $(DLLDIR)/userenv/tests/userenv_test.exe$(DLLEXT) $@ && $(STRIP) $@ -usp10_test.exe: $(DLLDIR)/usp10/tests/usp10_test.exe$(DLLEXT) - cp $(DLLDIR)/usp10/tests/usp10_test.exe$(DLLEXT) $@ && $(STRIP) $@ -uxtheme_test.exe: $(DLLDIR)/uxtheme/tests/uxtheme_test.exe$(DLLEXT) - cp $(DLLDIR)/uxtheme/tests/uxtheme_test.exe$(DLLEXT) $@ && $(STRIP) $@ -version_test.exe: $(DLLDIR)/version/tests/version_test.exe$(DLLEXT) - cp $(DLLDIR)/version/tests/version_test.exe$(DLLEXT) $@ && $(STRIP) $@ -winhttp_test.exe: $(DLLDIR)/winhttp/tests/winhttp_test.exe$(DLLEXT) - cp $(DLLDIR)/winhttp/tests/winhttp_test.exe$(DLLEXT) $@ && $(STRIP) $@ -wininet_test.exe: $(DLLDIR)/wininet/tests/wininet_test.exe$(DLLEXT) - cp $(DLLDIR)/wininet/tests/wininet_test.exe$(DLLEXT) $@ && $(STRIP) $@ -winmm_test.exe: $(DLLDIR)/winmm/tests/winmm_test.exe$(DLLEXT) - cp $(DLLDIR)/winmm/tests/winmm_test.exe$(DLLEXT) $@ && $(STRIP) $@ -winspool.drv_test.exe: $(DLLDIR)/winspool.drv/tests/winspool.drv_test.exe$(DLLEXT) - cp $(DLLDIR)/winspool.drv/tests/winspool.drv_test.exe$(DLLEXT) $@ && $(STRIP) $@ -wintrust_test.exe: $(DLLDIR)/wintrust/tests/wintrust_test.exe$(DLLEXT) - cp $(DLLDIR)/wintrust/tests/wintrust_test.exe$(DLLEXT) $@ && $(STRIP) $@ -ws2_32_test.exe: $(DLLDIR)/ws2_32/tests/ws2_32_test.exe$(DLLEXT) - cp $(DLLDIR)/ws2_32/tests/ws2_32_test.exe$(DLLEXT) $@ && $(STRIP) $@ - -# Special rules - -winetest.res: $(TESTBINS) - -clean:: - $(RM) dist.res winetest-dist winetest-dist.exe $(TESTBINS) - -# Rules for building distributable executable - -.PHONY: dist - -dist: winetest-dist.exe$(DLLEXT) winetest-dist$(EXEEXT) - -winetest-dist.exe.so: $(OBJS) dist.res Makefile.in - $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild $(APPMODE) $(OBJS) dist.res -o $@ -L$(DLLDIR) $(DELAYIMPORTS:%=-Wb,-d%) $(ALL_LIBS) - -winetest-dist: $(WINEWRAPPER) - $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@ - -winetest-dist.exe: $(OBJS) dist.res.o Makefile.in - $(CC) $(APPMODE) $(OBJS) dist.res.o -o $@ $(DELAYIMPORTS:%=-l%) $(ALL_LIBS) - -dist.res: winetest.rc build.nfo tests.url winetest.ico $(TESTBINS) - -@DEPENDENCIES@ # everything below this line is overwritten by make depend +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = winetest.exe +APPMODE = -mconsole +IMPORTS = comctl32 version user32 gdi32 advapi32 wsock32 kernel32 + +EXTRARCFLAGS = -DBUILD_SHA1=\"`GIT_DIR=$(TOPSRCDIR)/.git git rev-parse HEAD 2>/dev/null`\" + +C_SRCS = \ + gui.c \ + main.c \ + send.c \ + util.c + +RC_SRCS = \ + winetest.rc + +SVG_SRCS = winetest.svg + +@MAKE_PROG_RULES@ + +ALL_TEST_DIRS = @ALL_TEST_DIRS@ + +TESTBINS = $(ALL_TEST_DIRS:%/tests=%_test.exe) + +@ALL_WINETEST_DEPENDS@ + +# Special rules + +winetest.res: $(TESTBINS) + +tests.rc: Makefile.in $(TOPOBJDIR)/config.status + (for i in $(TESTBINS); do echo "$$i TESTRES \"$$i\""; done) >$@ || ($(RM) $@ && false) + +clean:: + $(RM) tests.rc dist.res winetest-dist winetest-dist.exe $(TESTBINS) + +depend: tests.rc + +# Rules for building distributable executable + +.PHONY: dist + +dist: winetest-dist.exe$(DLLEXT) winetest-dist$(EXEEXT) + +winetest-dist.exe.so: $(OBJS) dist.res Makefile.in + $(WINEGCC) -B$(TOOLSDIR)/tools/winebuild $(APPMODE) $(OBJS) dist.res -o $@ -L$(DLLDIR) $(DELAYIMPORTS:%=-Wb,-d%) $(ALL_LIBS) + +winetest-dist: $(WINEWRAPPER) + $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@ + +winetest-dist.exe: $(OBJS) dist.res.o Makefile.in + $(CC) $(APPMODE) $(OBJS) dist.res.o -o $@ $(DELAYIMPORTS:%=-l%) $(ALL_LIBS) + +dist.res: winetest.rc tests.rc build.nfo tests.url winetest.ico $(TESTBINS) + +@DEPENDENCIES@ # everything below this line is overwritten by make depend + +winetest.res: tests.rc diff --git a/programs/winetest/winetest.rc b/programs/winetest/winetest.rc index 4aaa099d684..a28e0d7099d 100644 --- a/programs/winetest/winetest.rc +++ b/programs/winetest/winetest.rc @@ -83,90 +83,4 @@ END /* @makedep: winetest.ico */ IDI_WINE ICON "winetest.ico" -/* list of tests (automatically generated by make_makefiles) */ - -advapi32_test.exe TESTRES "advapi32_test.exe" -advpack_test.exe TESTRES "advpack_test.exe" -browseui_test.exe TESTRES "browseui_test.exe" -cabinet_test.exe TESTRES "cabinet_test.exe" -comcat_test.exe TESTRES "comcat_test.exe" -comctl32_test.exe TESTRES "comctl32_test.exe" -comdlg32_test.exe TESTRES "comdlg32_test.exe" -credui_test.exe TESTRES "credui_test.exe" -crypt32_test.exe TESTRES "crypt32_test.exe" -cryptnet_test.exe TESTRES "cryptnet_test.exe" -d3d8_test.exe TESTRES "d3d8_test.exe" -d3d9_test.exe TESTRES "d3d9_test.exe" -d3drm_test.exe TESTRES "d3drm_test.exe" -d3dx8_test.exe TESTRES "d3dx8_test.exe" -d3dx9_36_test.exe TESTRES "d3dx9_36_test.exe" -d3dxof_test.exe TESTRES "d3dxof_test.exe" -ddraw_test.exe TESTRES "ddraw_test.exe" -dinput_test.exe TESTRES "dinput_test.exe" -dnsapi_test.exe TESTRES "dnsapi_test.exe" -dplayx_test.exe TESTRES "dplayx_test.exe" -dsound_test.exe TESTRES "dsound_test.exe" -fusion_test.exe TESTRES "fusion_test.exe" -gdi32_test.exe TESTRES "gdi32_test.exe" -gdiplus_test.exe TESTRES "gdiplus_test.exe" -hlink_test.exe TESTRES "hlink_test.exe" -imm32_test.exe TESTRES "imm32_test.exe" -inetcomm_test.exe TESTRES "inetcomm_test.exe" -inetmib1_test.exe TESTRES "inetmib1_test.exe" -infosoft_test.exe TESTRES "infosoft_test.exe" -iphlpapi_test.exe TESTRES "iphlpapi_test.exe" -itss_test.exe TESTRES "itss_test.exe" -jscript_test.exe TESTRES "jscript_test.exe" -kernel32_test.exe TESTRES "kernel32_test.exe" -localspl_test.exe TESTRES "localspl_test.exe" -localui_test.exe TESTRES "localui_test.exe" -lz32_test.exe TESTRES "lz32_test.exe" -mapi32_test.exe TESTRES "mapi32_test.exe" -mlang_test.exe TESTRES "mlang_test.exe" -msacm32_test.exe TESTRES "msacm32_test.exe" -mscms_test.exe TESTRES "mscms_test.exe" -mshtml_test.exe TESTRES "mshtml_test.exe" -msi_test.exe TESTRES "msi_test.exe" -mstask_test.exe TESTRES "mstask_test.exe" -msvcrt_test.exe TESTRES "msvcrt_test.exe" -msvcrtd_test.exe TESTRES "msvcrtd_test.exe" -msxml3_test.exe TESTRES "msxml3_test.exe" -netapi32_test.exe TESTRES "netapi32_test.exe" -ntdll_test.exe TESTRES "ntdll_test.exe" -ntdsapi_test.exe TESTRES "ntdsapi_test.exe" -ntprint_test.exe TESTRES "ntprint_test.exe" -odbccp32_test.exe TESTRES "odbccp32_test.exe" -ole32_test.exe TESTRES "ole32_test.exe" -oleaut32_test.exe TESTRES "oleaut32_test.exe" -opengl32_test.exe TESTRES "opengl32_test.exe" -pdh_test.exe TESTRES "pdh_test.exe" -psapi_test.exe TESTRES "psapi_test.exe" -qedit_test.exe TESTRES "qedit_test.exe" -qmgr_test.exe TESTRES "qmgr_test.exe" -quartz_test.exe TESTRES "quartz_test.exe" -rasapi32_test.exe TESTRES "rasapi32_test.exe" -riched20_test.exe TESTRES "riched20_test.exe" -riched32_test.exe TESTRES "riched32_test.exe" -rpcrt4_test.exe TESTRES "rpcrt4_test.exe" -rsaenh_test.exe TESTRES "rsaenh_test.exe" -schannel_test.exe TESTRES "schannel_test.exe" -secur32_test.exe TESTRES "secur32_test.exe" -serialui_test.exe TESTRES "serialui_test.exe" -setupapi_test.exe TESTRES "setupapi_test.exe" -shdocvw_test.exe TESTRES "shdocvw_test.exe" -shell32_test.exe TESTRES "shell32_test.exe" -shlwapi_test.exe TESTRES "shlwapi_test.exe" -snmpapi_test.exe TESTRES "snmpapi_test.exe" -spoolss_test.exe TESTRES "spoolss_test.exe" -urlmon_test.exe TESTRES "urlmon_test.exe" -user32_test.exe TESTRES "user32_test.exe" -userenv_test.exe TESTRES "userenv_test.exe" -usp10_test.exe TESTRES "usp10_test.exe" -uxtheme_test.exe TESTRES "uxtheme_test.exe" -version_test.exe TESTRES "version_test.exe" -winhttp_test.exe TESTRES "winhttp_test.exe" -wininet_test.exe TESTRES "wininet_test.exe" -winmm_test.exe TESTRES "winmm_test.exe" -winspool.drv_test.exe TESTRES "winspool.drv_test.exe" -wintrust_test.exe TESTRES "wintrust_test.exe" -ws2_32_test.exe TESTRES "ws2_32_test.exe" +#include "tests.rc" diff --git a/programs/winhlp32/Zh.rc b/programs/winhlp32/Zh.rc dissimilarity index 62% index 7f69ec25744..d510450e862 100644 --- a/programs/winhlp32/Zh.rc +++ b/programs/winhlp32/Zh.rc @@ -1,86 +1,162 @@ -/* - * Help Viewer - * Simplified Chinese Language Support - * - * Copyright 2002 liuspider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -/* Menu */ - -MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ - POPUP "Îļþ£¨&F£©" { - MENUITEM "´ò¿ª£¨&O£©", MNID_FILE_OPEN - MENUITEM SEPARATOR - MENUITEM "´òÓ¡£¨&P£©", MNID_FILE_PRINT - MENUITEM "´òÓ¡»úÉèÖã¨&S£©...", MNID_FILE_SETUP - MENUITEM SEPARATOR - MENUITEM "Í˳ö£¨&E£©", MNID_FILE_EXIT - } - POPUP "±à¼­£¨&E£©" { - MENUITEM "¸´ÖÆ£¨&C£©...", MNID_EDIT_COPYDLG - MENUITEM SEPARATOR - MENUITEM "×¢ÊÍ£¨&A£©...", MNID_EDIT_ANNOTATE - } - POPUP "ÊéÇ©£¨&B£©" { - MENUITEM "¶¨Ò壨&D£©...", MNID_BKMK_DEFINE - } - POPUP "Ñ¡Ï&O£©" { - POPUP "ÏÔʾ°ïÖú" - BEGIN - MENUITEM "ĬÈÏ", MNID_OPTS_HELP_DEFAULT - MENUITEM "ÏÔʾ", MNID_OPTS_HELP_VISIBLE - MENUITEM "²»ÏÔʾ", MNID_OPTS_HELP_NONVISIBLE - END - MENUITEM "ÀúÊ·", MNID_OPTS_HISTORY - POPUP "×ÖÌå" - BEGIN - MENUITEM "СºÅ", MNID_OPTS_FONTS_SMALL - MENUITEM "ÖкÅ", MNID_OPTS_FONTS_NORMAL - MENUITEM "´óºÅ", MNID_OPTS_FONTS_LARGE - END - MENUITEM "ʹÓÃϵͳÑÕÉ«", MNID_OPTS_SYSTEM_COLORS - } - POPUP "°ïÖú£¨&H£©" { - MENUITEM "ÈçºÎʹÓðïÖú£¨&O£©", MNID_HELP_HELPON - MENUITEM "×ÜÊÇÔÚ×îÇ°Ã棨&T£©", MNID_HELP_HELPTOP - MENUITEM SEPARATOR - MENUITEM "×ÊÁÏÐÅÏ¢£¨&I£©...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "¹ØÓÚ WINE£¨&A£©", MNID_HELP_WINE -#endif - } -} - -/* Strings */ -STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -{ -STID_WINE_HELP, "WINE °ïÖú" -STID_WHERROR, "´íÎó" -STID_WARNING, "¾¯¸æ" -STID_INFO, "ÐÅÏ¢" -STID_NOT_IMPLEMENTED, "δʵÏÖ" -STID_HLPFILE_ERROR_s, "¶ÁÈë°ïÖúÎļþ ¡®%s¡¯ ʱ·¢Éú´íÎó" -STID_INDEX, "ÄÚÈÝ£¨&C£©" -STID_CONTENTS, "¸ÅÒª" -STID_BACK, "·µ»Ø£¨&B£©" -STID_ALL_FILES, "ËùÓÐÎļþ (*.*)" -STID_HELP_FILES_HLP, "°ïÖúÎļþ (*.hlp)" -STID_FILE_NOT_FOUND_s "²»ÄÜ´ò¿ªÎļþ '%s'. ÄãÏëÒª×Ô¼ºÕÒÕâ¸öÎļþÂð?" -STID_NO_RICHEDIT "ÕÒ²»µ½ richedit ... ÖÕÖ¹" -STID_PSH_INDEX, "°ïÖúÄÚÈÝ: " -} +/* + * Help Viewer + * Simplified and Traditional Chinese Language Support + * + * Copyright 2002 liuspider + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +/* Menu */ + +MAIN_MENU MENU +{ + POPUP "文件(&F)" { + MENUITEM "打开(&O)", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "打印(&P)", MNID_FILE_PRINT + MENUITEM "打印机设置(&S)...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "退出(&E)", MNID_FILE_EXIT + } + POPUP "编辑(&E)" { + MENUITEM "复制(&C)...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "注释(&A)...", MNID_EDIT_ANNOTATE + } + POPUP "书签(&B)" { + MENUITEM "定义(&D)...", MNID_BKMK_DEFINE + } + POPUP "选项(&O)" { + POPUP "显示帮助" + BEGIN + MENUITEM "默认", MNID_OPTS_HELP_DEFAULT + MENUITEM "显示", MNID_OPTS_HELP_VISIBLE + MENUITEM "不显示", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "历史", MNID_OPTS_HISTORY + POPUP "字体" + BEGIN + MENUITEM "小号", MNID_OPTS_FONTS_SMALL + MENUITEM "中号", MNID_OPTS_FONTS_NORMAL + MENUITEM "大号", MNID_OPTS_FONTS_LARGE + END + MENUITEM "使用系统颜色", MNID_OPTS_SYSTEM_COLORS + } + POPUP "帮助(&H)" { + MENUITEM "如何使用帮助(&O)", MNID_HELP_HELPON + MENUITEM "总是在最前面(&T)", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "资料信息(&I)...", MNID_HELP_ABOUT +#ifdef WINELIB + MENUITEM "关于 WINE(&A)", MNID_HELP_WINE +#endif + } +} + +/* Strings */ +STRINGTABLE DISCARDABLE +{ +STID_WINE_HELP, "WINE 帮助" +STID_WHERROR, "错误" +STID_WARNING, "警告" +STID_INFO, "信息" +STID_NOT_IMPLEMENTED, "未实现" +STID_HLPFILE_ERROR_s, "读入帮助文件 ‘%s’ 时发生错误" +STID_INDEX, "内容(&C)" +STID_CONTENTS, "概要" +STID_BACK, "返回(&B)" +STID_ALL_FILES, "所有文件 (*.*)" +STID_HELP_FILES_HLP, "帮助文件 (*.hlp)" +STID_FILE_NOT_FOUND_s "不能打开文件 '%s'. 你想要自己找这个文件吗?" +STID_NO_RICHEDIT "找不到 richedit ... 终止" +STID_PSH_INDEX, "帮助内容: " +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +/* Menu */ + +MAIN_MENU MENU +{ + POPUP "檔案(&F)" { + MENUITEM "開啟(&O)", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "列印(&P)", MNID_FILE_PRINT + MENUITEM "印表機設定(&S)...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "結束(&E)", MNID_FILE_EXIT + } + POPUP "編輯(&E)" { + MENUITEM "複製(&C)...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "註釋(&A)...", MNID_EDIT_ANNOTATE + } + POPUP "書籤(&B)" { + MENUITEM "定義(&D)...", MNID_BKMK_DEFINE + } + POPUP "選項(&O)" { + POPUP "顯示幫助" + BEGIN + MENUITEM "默認", MNID_OPTS_HELP_DEFAULT + MENUITEM "顯示", MNID_OPTS_HELP_VISIBLE + MENUITEM "不顯示", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "歷史", MNID_OPTS_HISTORY + POPUP "字型" + BEGIN + MENUITEM "小號", MNID_OPTS_FONTS_SMALL + MENUITEM "中號", MNID_OPTS_FONTS_NORMAL + MENUITEM "大號", MNID_OPTS_FONTS_LARGE + END + MENUITEM "使用系統顏色", MNID_OPTS_SYSTEM_COLORS + } + POPUP "幫助(&H)" { + MENUITEM "如何使用幫助(&O)", MNID_HELP_HELPON + MENUITEM "總是在最上面(&T)", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "資訊(&I)...", MNID_HELP_ABOUT +#ifdef WINELIB + MENUITEM "關於 WINE(&A)", MNID_HELP_WINE +#endif + } +} + +/* Strings */ +STRINGTABLE DISCARDABLE +{ +STID_WINE_HELP, "WINE 幫助" +STID_WHERROR, "錯誤" +STID_WARNING, "警告" +STID_INFO, "資訊" +STID_NOT_IMPLEMENTED, "未實現" +STID_HLPFILE_ERROR_s, "讀入幫助檔案 ‘%s’ 時發生錯誤" +STID_INDEX, "內容(&C)" +STID_CONTENTS, "概要" +STID_BACK, "返回(&B)" +STID_ALL_FILES, "所有檔案 (*.*)" +STID_HELP_FILES_HLP, "幫助檔案 (*.hlp)" +STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案嗎?" +STID_NO_RICHEDIT "找不到 richedit ... 終止" +STID_PSH_INDEX, "幫助內容: " +} + +#pragma code_page(default) diff --git a/tools/make_makefiles b/tools/make_makefiles index 53ed0ba01ac..143805bafe2 100755 --- a/tools/make_makefiles +++ b/tools/make_makefiles @@ -74,7 +74,9 @@ my @ignores = ( "dlls/*/tests/*crosstest.exe", "dlls/*/tests/testlist.c", "include/config.h", - "include/stamp-h" + "include/stamp-h", + "programs/winetest/tests.rc", + "programs/winetest/*_test.exe", ); # Source files and their resulting target to ignore @@ -207,49 +209,12 @@ sub parse_makefile($) $make{$1} = \@list; next; } - if (/^\#\s*MKDLL_SKIP/ || /^\#\s*MKPROG_SKIP/) - { - $make{"=skip"} = 1; - next; - } } return %make; } ################################################################ -# update the tests list in programs/winetest/Makefile.in and programs/winetest/winetest.rc - -sub update_winetest(@) -{ - my (@tests, @lines); - - foreach my $file (@_) - { - if ($file =~ /^dlls\/(.*)\/tests\/Makefile/) { push @tests, $1; } - } - push @lines, "TESTBINS ="; - push @lines, map { " \\\n\t" . $_ . "_test.exe"; } sort @tests; - push @lines, "\n\n"; - - foreach my $test (sort @tests) - { - push @lines, "${test}_test.exe: \$(DLLDIR)/$test/tests/${test}_test.exe\$(DLLEXT)\n"; - push @lines, "\tcp \$(DLLDIR)/$test/tests/${test}_test.exe\$(DLLEXT) \$\@ && \$(STRIP) \$\@\n"; - } - push @lines, "\n# Special rules\n"; - - replace_in_file( "programs/winetest/Makefile.in", '^TESTBINS\s*=', '^# Special rules', @lines ); - - replace_in_file( "programs/winetest/winetest.rc", ' TESTRES ', undef, - map { $_ . "_test.exe TESTRES \"" . $_ . "_test.exe\"\n"; } sort @tests ); - - # return a list of test exe files for .gitignore - return map { "programs/winetest/" . $_ . "_test.exe"; } sort @tests; -} - - -################################################################ # update the makefile list in configure.ac sub update_makefiles(@) @@ -285,8 +250,8 @@ sub update_makefiles(@) push @lines, "WINE_CONFIG_MAKEFILE([$file],[$rules]$args)\n"; } - push @lines, "\nAC_OUTPUT\n"; - replace_in_file( "configure.ac", '^WINE_CONFIG_MAKERULES', '^AC_OUTPUT$', @lines); + push @lines, "\ndnl Build dependencies for test files compiled into winetest\n"; + replace_in_file( "configure.ac", '^WINE_CONFIG_MAKERULES', '^dnl Build dependencies for test files compiled into winetest$', @lines); } @@ -308,7 +273,6 @@ sub update_ignores(@) next unless defined $makefile{$pattern[0]}; push @list, map { (my $ret = $_) =~ s/$pattern[1]$/$pattern[2]/; $ret; } @{$makefile{$pattern[0]}}; } - push @list, @{$makefile{"RC_BINARIES"}} if defined $makefile{"RC_BINARIES"}; foreach my $f (@list) { push @ignores, $makefile{"=dir"} . $f unless $f =~ /\$\(.*\)/; # skip make variables @@ -329,7 +293,6 @@ sub update_dlls(@) foreach my $make (@_) { my %makefile = %{$makefiles{$make}}; - next if defined $makefile{"=skip"}; next if ($makefile{"=rules"} eq $makerules{"MAKE_TEST_RULES"}); next unless defined $makefile{"MODULE"}; @@ -604,6 +567,5 @@ foreach my $file (sort values %makerules, @makefiles) update_makefiles( @makefiles ); push @ignores, update_ignores( @makefiles ); -push @ignores, update_winetest( @makefiles ); push @ignores, update_dlls( sort grep /^dlls\//, @makefiles ); update_gitignore( @ignores ); diff --git a/tools/widl/client.c b/tools/widl/client.c index 779492e9171..6f148c1c396 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -188,6 +188,14 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) indent++; print_client("_Handle = NDRCContextBinding(%s%s);\n", is_ch_ptr ? "*" : "", context_handle_var->name); indent--; + if (is_attr(context_handle_var->attrs, ATTR_IN) && + !is_attr(context_handle_var->attrs, ATTR_OUT)) + { + print_client("else\n"); + indent++; + print_client("RpcRaiseException(RPC_X_SS_IN_NULL_CONTEXT);\n"); + indent--; + } fprintf(client, "\n"); } else if (implicit_handle) diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c index 60ee3c06fd6..c5c79c32ec8 100644 --- a/tools/widl/proxy.c +++ b/tools/widl/proxy.c @@ -199,6 +199,11 @@ int cant_be_null(const var_t *v) const attr_list_t *attrs = v->attrs; const type_t *type = v->type; + /* context handles have their own checking so they can be null for the + * purposes of null ref pointer checking */ + if (is_aliaschain_attr(type, ATTR_CONTEXTHANDLE)) + return 0; + if (! attrs && type) { attrs = type->attrs; -- 2.11.4.GIT