static void test_SQLGetPrivateProfileStringW(void) { static WCHAR testing[] = {'t','e','s','t','i','n','g',0}; static WCHAR wineodbc[] = {'w','i','n','e','o','d','b','c',0}; static WCHAR defaultval[] = {'d','e','f','a','u','l','t',0}; static WCHAR odbcini[] = {'O','D','B','C','.','I','N','I',0}; static WCHAR abcdini[] = {'a','b','c','d','.','I','N','I',0}; static WCHAR wine[] = {'w','i','n','e',0}; static WCHAR value[] = {'v','a','l','u','e',0}; static WCHAR empty[] = {0}; static WCHAR defaultX[] = {'d','e','f','a','u','l','t',0}; static WCHAR def[] = {'d','e','f',0}; static WCHAR value0[] = {'v','a','l','u','e','0','1','2','3','4','5','6','7','8','9',0}; static WCHAR testingvalue[] = {'t','e','s','t','i','n','g',0,'v','a','l','u','e',0}; int ret; WCHAR buffer[256] = {0}; LONG reg_ret; lstrcpyW(buffer, wine); ret = SQLGetPrivateProfileStringW(NULL, testing , defaultval, buffer, 256, odbcini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, wine), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); lstrcpyW(buffer, wine); ret = SQLGetPrivateProfileStringW(wineodbc, NULL , defaultval, buffer, 256, odbcini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, empty), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); lstrcpyW(buffer, value); ret = SQLGetPrivateProfileStringW(wineodbc, testing , NULL, buffer, 256, odbcini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, empty), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 256, odbcini); ok(ret == lstrlenW(defaultX), "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, defaultX), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 4, odbcini); ok(ret == lstrlenW(def), "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, def), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 8, odbcini); ok(ret == lstrlenW(defaultX), "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, defaultX), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, NULL, 256, odbcini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); lstrcpyW(buffer, value); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 0, odbcini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, value), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLWritePrivateProfileString("wineodbc", "testing" , "value0123456789", "abcd.ini"); ok(ret, "SQLWritePrivateProfileString failed\n"); if(ret) { HKEY hkey; ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 256, abcdini); ok(ret == lstrlenW(value0), "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, value0), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, NULL, 0, abcdini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); ret = SQLGetPrivateProfileStringW(wineodbc, testing , defaultX, buffer, 7, abcdini); ok(ret == 6, "SQLGetPrivateProfileStringW returned %d\n", ret); lstrcpyW(buffer, wine); ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 10, abcdini); ok(ret == lstrlenW(testing)+1, "SQLGetPrivateProfileStringW returned %d\n", ret); ok(!lstrcmpW(buffer, testing), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); ret = SQLWritePrivateProfileString("wineodbc", "value" , "0", "abcd.ini"); ok(ret, "SQLWritePrivateProfileString failed\n"); lstrcpyW(buffer, wine); ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 256, abcdini); ok(ret == (lstrlenW(testing) + lstrlenW(value)+2), "SQLGetPrivateProfileStringW returned %d\n", ret); if(ret == (lstrlenW(testing) + lstrlenW(value)+2)) { ok(!memcmp(buffer, testingvalue, sizeof(testingvalue)), "incorrect string '%s'\n", wine_dbgstr_wn(buffer, ret)); } lstrcpyW(buffer, value); ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 10, abcdini); ok(ret == lstrlenW(testing)+1, "SQLGetPrivateProfileStringW returned %d\n", ret); if(ret >= lstrlenW(testing)+1) { ok(!lstrcmpW(buffer, testing), "incorrect string '%s'\n", wine_dbgstr_w(buffer)); } lstrcpyW(buffer, value); ret = SQLGetPrivateProfileStringW(wineodbc, NULL , empty, buffer, 2, abcdini); ok(ret == 0, "SQLGetPrivateProfileStringW returned %d\n", ret); reg_ret = RegOpenKeyExW(HKEY_CURRENT_USER, abcd_key, 0, KEY_READ, &hkey); ok(reg_ret == ERROR_SUCCESS, "RegOpenKeyExW failed\n"); if(reg_ret == ERROR_SUCCESS) { reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, abcd_key); ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); RegCloseKey(hkey); } /* Cleanup key */ reg_ret = RegDeleteKeyW(HKEY_CURRENT_USER, abcdini_key); ok(reg_ret == ERROR_SUCCESS, "RegDeleteKeyW failed\n"); } }
BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCWSTR keyPath, LPCWSTR newName) { LPWSTR parentPath = 0; LPCWSTR srcSubKey = 0; HKEY parentKey = 0; HKEY destKey = 0; BOOL result = FALSE; LONG lRet; DWORD disposition; if (!keyPath || !newName) return FALSE; if (!strrchrW(keyPath, '\\')) { parentKey = hRootKey; srcSubKey = keyPath; } else { LPWSTR srcSubKey_copy; parentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(keyPath)+1)*sizeof(WCHAR)); lstrcpyW(parentPath, keyPath); srcSubKey_copy = strrchrW(parentPath, '\\'); *srcSubKey_copy = 0; srcSubKey = srcSubKey_copy + 1; lRet = RegOpenKeyExW(hRootKey, parentPath, 0, KEY_READ | KEY_CREATE_SUB_KEY, &parentKey); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; } } /* The following fails if the old name is the same as the new name. */ if (!lstrcmpW(srcSubKey, newName)) goto done; lRet = RegCreateKeyExW(parentKey, newName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL /* FIXME */, &destKey, &disposition); if (disposition == REG_OPENED_EXISTING_KEY) lRet = ERROR_FILE_EXISTS; /* FIXME: we might want a better error message than this */ if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; } /* FIXME: SHCopyKey does not copy the security attributes */ lRet = SHCopyKeyW(parentKey, srcSubKey, destKey, 0); if (lRet != ERROR_SUCCESS) { RegCloseKey(destKey); RegDeleteKeyW(parentKey, newName); error_code_messagebox(hwnd, lRet); goto done; } lRet = SHDeleteKeyW(hRootKey, keyPath); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; } result = TRUE; done: RegCloseKey(destKey); if (parentKey) { RegCloseKey(parentKey); HeapFree(GetProcessHeap(), 0, parentPath); } return result; }
/******************************************************************************* * GAMEUX_FindGameInstanceId * * Internal helper function. Description available in gameux_private.h file */ HRESULT GAMEUX_FindGameInstanceId( LPCWSTR sGDFBinaryPath, GAME_INSTALL_SCOPE installScope, GUID* pInstanceId) { static const WCHAR sConfigGDFBinaryPath[] = {'C','o','n','f','i','g','G','D','F','B','i','n','a','r','y','P','a','t','h',0}; HRESULT hr; BOOL found = FALSE; LPWSTR lpRegistryPath = NULL; HKEY hRootKey; DWORD dwSubKeys, dwSubKeyLen, dwMaxSubKeyLen, i; LPWSTR lpName = NULL, lpValue = NULL; hr = GAMEUX_buildGameRegistryPath(installScope, NULL, &lpRegistryPath); if(SUCCEEDED(hr)) /* enumerate all subkeys of received one and search them for value "ConfigGGDFBinaryPath" */ hr = HRESULT_FROM_WIN32(RegOpenKeyExW(HKEY_LOCAL_MACHINE, lpRegistryPath, 0, KEY_READ | KEY_WOW64_64KEY, &hRootKey)); if(SUCCEEDED(hr)) { hr = HRESULT_FROM_WIN32(RegQueryInfoKeyW(hRootKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL)); if(SUCCEEDED(hr)) { ++dwMaxSubKeyLen; /* for string terminator */ lpName = CoTaskMemAlloc(dwMaxSubKeyLen*sizeof(WCHAR)); if(!lpName) hr = E_OUTOFMEMORY; } if(SUCCEEDED(hr)) { for(i=0; i<dwSubKeys && !found; ++i) { dwSubKeyLen = dwMaxSubKeyLen; hr = HRESULT_FROM_WIN32(RegEnumKeyExW(hRootKey, i, lpName, &dwSubKeyLen, NULL, NULL, NULL, NULL)); if(SUCCEEDED(hr)) hr = GAMEUX_LoadRegistryString(hRootKey, lpName, sConfigGDFBinaryPath, &lpValue); if(SUCCEEDED(hr)) if(lstrcmpW(lpValue, sGDFBinaryPath)==0) { /* key found, let's copy instance id and exit */ hr = (GUIDFromStringW(lpName, pInstanceId) ? S_OK : E_FAIL); found = TRUE; } HeapFree(GetProcessHeap(), 0, lpValue); } } HeapFree(GetProcessHeap(), 0, lpName); RegCloseKey(hRootKey); } HeapFree(GetProcessHeap(), 0, lpRegistryPath); if((SUCCEEDED(hr) && !found) || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) hr = S_FALSE; return hr; }
/*--------------------------------------------------------------------------*/ int dictionary_set (LPDICTIONARY lpDict, // Ptr to workspace dictionary LPWCHAR lpwKey, LPWCHAR lpwVal) { int i; UINT hash; Assert (lpDict NE NULL); Assert (lpwKey NE NULL); // Hash the key hash = dictionary_hash (lpwKey); /* Find if value is already in dictionary */ if (lpDict->n > 0) { for (i = 0; i < lpDict->size; i++) if (lpDict->key[i] NE NULL) { if (hash EQ lpDict->hash[i]) { /* Same hash value */ if (!lstrcmpW (lpwKey, lpDict->key[i])) { /* Same key */ /* Found a value: modify and return */ if (lpwVal EQ NULL || (lpDict->inifile <= lpwVal && lpwVal < (lpDict->inifile + lpDict->size))) lpDict->val[i] = lpwVal; else { if (lpDict->val[i] NE NULL) { free (lpDict->val[i]); lpDict->val[i] = NULL; } // End IF if (lpwVal NE NULL) { lpwVal = strdupW (lpwVal); if (lpwVal EQ NULL) return -1; } // End IF lpDict->val[i] = lpwVal; } // End IF/ELSE /* Value has been modified: return */ return 0; } // End IF } // End IF } // End FOR/IF } // End IF /* Add a new value */ /* See if dictionary needs to grow */ if (lpDict->n EQ lpDict->size) { LPWCHAR *val; // Ptr to list of string values LPWCHAR *key; // Ptr to list of string keys LPUINT hash; // Ptr to list of hash values for keys /* Reached maximum size: reallocate dictionary */ val = (LPWCHAR *) mem_double (lpDict->val, lpDict->size * sizeof (*lpDict->val)); key = (LPWCHAR *) mem_double (lpDict->key, lpDict->size * sizeof (*lpDict->key)); hash = (LPUINT) mem_double (lpDict->hash, lpDict->size * sizeof (*lpDict->hash)); if ((val EQ NULL) || (key EQ NULL) || (hash EQ NULL)) { // Replace the values that succeeded in doubling if (val NE NULL) lpDict->val = val; if (key NE NULL) lpDict->key = key; if (hash NE NULL) lpDict->hash = hash; /* Cannot grow dictionary */ return -1; } // End IF lpDict->val = val; lpDict->key = key; lpDict->hash = hash; /* Double size */ lpDict->size *= 2; } // End IF /* Insert key in the first empty slot */ for (i = 0; i < lpDict->size; i++) if (lpDict->key[i] EQ NULL) /* Add key here */ break; // If the key is NULL or within the file contents, it can be // stored directly; otherwise it must be duplicated. if (lpwKey EQ NULL || (lpDict->inifile <= lpwKey && lpwKey < (lpDict->inifile + lpDict->size))) lpDict->key[i] = lpwKey; else { lpDict->key[i] = strdupW (lpwKey); if (lpDict->key[i] EQ NULL) return -1; } // End IF/ELSE // If the value is NULL or within the file contents, it can be // stored directly; otherwise it must be duplicated. if (lpwVal EQ NULL || (lpDict->inifile <= lpwVal && lpwVal < (lpDict->inifile + lpDict->size))) lpDict->val[i] = lpwVal; else { if (lpDict->val[i] NE NULL) { free (lpDict->val[i]); lpDict->val[i] = NULL; } // End IF lpDict->val[i] = strdupW (lpwVal); if (lpDict->val[i] EQ NULL) return -1; } // End IF/ELSE lpDict->hash[i] = hash; lpDict->n++; return 0; } // End dictionary_set
/****************************************************************** CaExecSecureObjects - entry point for SecureObjects Custom Action called as Type 1025 CustomAction (deferred binary DLL) NOTE: deferred CustomAction since it modifies the machine NOTE: CustomActionData == wzObject\twzTable\twzDomain\twzUser\tdwPermissions\twzObject\t... ******************************************************************/ extern "C" UINT __stdcall ExecSecureObjects( __in MSIHANDLE hInstall ) { // AssertSz(FALSE, "debug ExecSecureObjects"); HRESULT hr = S_OK; DWORD er = ERROR_SUCCESS; LPWSTR pwz = NULL; LPWSTR pwzData = NULL; LPWSTR pwzObject = NULL; LPWSTR pwzTable = NULL; LPWSTR pwzDomain = NULL; DWORD dwRevision = 0; LPWSTR pwzUser = NULL; DWORD dwPermissions = 0; LPWSTR pwzAccount = NULL; PSID psid = NULL; EXPLICIT_ACCESSW ea = {0}; SE_OBJECT_TYPE objectType = SE_UNKNOWN_OBJECT_TYPE; PSECURITY_DESCRIPTOR psd = NULL; SECURITY_DESCRIPTOR_CONTROL sdc = {0}; SECURITY_INFORMATION si = {0}; PACL pAclExisting = NULL; // doesn't get freed PACL pAclNew = NULL; PMSIHANDLE hActionRec = ::MsiCreateRecord(1); // // initialize // hr = WcaInitialize(hInstall, "ExecSecureObjects"); ExitOnFailure(hr, "failed to initialize"); hr = WcaGetProperty(L"CustomActionData", &pwzData); ExitOnFailure(hr, "failed to get CustomActionData"); WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %S", pwzData); pwz = pwzData; // // loop through all the passed in data // while (pwz && *pwz) { hr = WcaReadStringFromCaData(&pwz, &pwzObject); ExitOnFailure(hr, "failed to process CustomActionData"); hr = WcaReadStringFromCaData(&pwz, &pwzTable); ExitOnFailure(hr, "failed to process CustomActionData"); hr = WcaReadStringFromCaData(&pwz, &pwzDomain); ExitOnFailure(hr, "failed to process CustomActionData"); hr = WcaReadStringFromCaData(&pwz, &pwzUser); ExitOnFailure(hr, "failed to process CustomActionData"); hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int*>(&dwPermissions)); ExitOnFailure(hr, "failed to processCustomActionData"); WcaLog(LOGMSG_VERBOSE, "Securing Object: %S Type: %S User: %S", pwzObject, pwzTable, pwzUser); // // create the appropriate SID // // figure out the right user to put into the access block if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Everyone")) { hr = AclGetWellKnownSid(WinWorldSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Administrators")) { hr = AclGetWellKnownSid(WinBuiltinAdministratorsSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalSystem")) { hr = AclGetWellKnownSid(WinLocalSystemSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalService")) { hr = AclGetWellKnownSid(WinLocalServiceSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"NetworkService")) { hr = AclGetWellKnownSid(WinNetworkServiceSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"AuthenticatedUser")) { hr = AclGetWellKnownSid(WinAuthenticatedUserSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Guests")) { hr = AclGetWellKnownSid(WinBuiltinGuestsSid, &psid); } else if(!*pwzDomain && 0 == lstrcmpW(pwzUser, L"CREATOR OWNER")) { hr = AclGetWellKnownSid(WinCreatorOwnerSid, &psid); } else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"INTERACTIVE")) { hr = AclGetWellKnownSid(WinInteractiveSid, &psid); } else if(!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Users")) { hr = AclGetWellKnownSid(WinBuiltinUsersSid, &psid); } else { hr = StrAllocFormatted(&pwzAccount, L"%s\\%s", *pwzDomain ? pwzDomain : L".", pwzUser); ExitOnFailure(hr, "failed to build domain user name"); hr = AclGetAccountSid(NULL, pwzAccount, &psid); } ExitOnFailure3(hr, "failed to get sid for account: %S%S%S", pwzDomain, *pwzDomain ? L"\\" : L"", pwzUser); // // build up the explicit access // ea.grfAccessPermissions = dwPermissions; ea.grfAccessMode = SET_ACCESS; if (0 == lstrcmpW(L"CreateFolder", pwzTable)) { ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; } else { ea.grfInheritance = NO_INHERITANCE; } ::BuildTrusteeWithSidW(&ea.Trustee, psid); if (0 == lstrcmpW(L"ServiceInstall", pwzTable)) { objectType = SE_SERVICE; // always add these permissions for services // these are basic permissions that are often forgotten dwPermissions |= SERVICE_QUERY_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_INTERROGATE; } else if (0 == lstrcmpW(L"CreateFolder", pwzTable) || 0 == lstrcmpW(L"File", pwzTable)) { objectType = SE_FILE_OBJECT; } else if (0 == lstrcmpW(L"Registry", pwzTable)) { objectType = SE_REGISTRY_KEY; } if (SE_UNKNOWN_OBJECT_TYPE != objectType) { er = ::GetNamedSecurityInfoW(pwzObject, objectType, DACL_SECURITY_INFORMATION, NULL, NULL, &pAclExisting, NULL, &psd); ExitOnFailure1(hr = HRESULT_FROM_WIN32(er), "failed to get security info for object: %S", pwzObject); //Need to see if DACL is protected so getting Descriptor information if(!::GetSecurityDescriptorControl(psd, &sdc, &dwRevision)) { ExitOnLastError1(hr, "failed to get security descriptor control for object: %S", pwzObject); } er = ::SetEntriesInAclW(1, &ea, pAclExisting, &pAclNew); ExitOnFailure1(hr = HRESULT_FROM_WIN32(er), "failed to add ACLs for object: %S", pwzObject); if (sdc & SE_DACL_PROTECTED) { si = DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION; } else { si = DACL_SECURITY_INFORMATION; } er = ::SetNamedSecurityInfoW(pwzObject, objectType, si, NULL, NULL, pAclNew, NULL); MessageExitOnFailure1(hr = HRESULT_FROM_WIN32(er), msierrSecureObjectsFailedSet, "failed to set security info for object: %S", pwzObject); } else { MessageExitOnFailure1(hr = E_UNEXPECTED, msierrSecureObjectsUnknownType, "unknown object type: %S", pwzTable); } hr = WcaProgressMessage(COST_SECUREOBJECT, FALSE); ExitOnFailure(hr, "failed to send progress message"); objectType = SE_UNKNOWN_OBJECT_TYPE; } LExit: ReleaseStr(pwzUser); ReleaseStr(pwzDomain); ReleaseStr(pwzTable); ReleaseStr(pwzObject); ReleaseStr(pwzData); ReleaseStr(pwzAccount); if (pAclNew) ::LocalFree(pAclNew); if (psd) ::LocalFree(psd); if (psid) AclFreeSid(psid); if (FAILED(hr)) er = ERROR_INSTALL_FAILURE; return WcaFinalize(er); }
/******************************************************************** AllocateAcl - allocate an acl and populate it with this user and permission information user could be user or domain\user ********************************************************************/ HRESULT AllocateAcl(SCA_SMBP* pssp, PACL* ppACL) { HRESULT hr = S_OK; EXPLICIT_ACCESSW* pEA = NULL; DWORD cEA = 0; DWORD dwCounter = 0; PSID psid = NULL; LPCWSTR wzUser = NULL; DWORD nPermissions = 0; DWORD nErrorReturn = 0; ACCESS_MODE accessMode = NOT_USED_ACCESS; cEA = pssp->dwUserPermissionCount + 1; if (cEA >= MAXSIZE_T / sizeof(EXPLICIT_ACCESSW)) { ExitOnFailure1(hr = E_OUTOFMEMORY, "Too many user permissions to allocate: %u", cEA); } pEA = static_cast<EXPLICIT_ACCESSW*>(MemAlloc(cEA * sizeof(EXPLICIT_ACCESSW), TRUE)); ExitOnNull(pEA, hr, E_OUTOFMEMORY, "failed to allocate memory for explicit access structure"); // figure out how big the psid is for (dwCounter = 0; dwCounter < pssp->dwUserPermissionCount; ++dwCounter) { wzUser = pssp->pUserPerms[dwCounter].wzUser; nPermissions = pssp->pUserPerms[dwCounter].nPermissions; accessMode = pssp->pUserPerms[dwCounter].accessMode; // // create the appropriate SID // // figure out the right user to put into the access block if (0 == lstrcmpW(wzUser, L"Everyone")) { hr = AclGetWellKnownSid(WinWorldSid, &psid); } else if (0 == lstrcmpW(wzUser, L"Administrators")) { hr = AclGetWellKnownSid(WinBuiltinAdministratorsSid, &psid); } else if (0 == lstrcmpW(wzUser, L"LocalSystem")) { hr = AclGetWellKnownSid(WinLocalSystemSid, &psid); } else if (0 == lstrcmpW(wzUser, L"LocalService")) { hr = AclGetWellKnownSid(WinLocalServiceSid, &psid); } else if (0 == lstrcmpW(wzUser, L"NetworkService")) { hr = AclGetWellKnownSid(WinNetworkServiceSid, &psid); } else if (0 == lstrcmpW(wzUser, L"AuthenticatedUser")) { hr = AclGetWellKnownSid(WinAuthenticatedUserSid, &psid); } else if (0 == lstrcmpW(wzUser, L"Guests")) { hr = AclGetWellKnownSid(WinBuiltinGuestsSid, &psid); } else if(0 == lstrcmpW(wzUser, L"CREATOR OWNER")) { hr = AclGetWellKnownSid(WinCreatorOwnerSid, &psid); } else { hr = AclGetAccountSid(NULL, wzUser, &psid); } ExitOnFailure1(hr, "failed to get sid for account: %ls", wzUser); // we now have a valid pSid, fill in the EXPLICIT_ACCESS /* Permissions options: (see sca.sdh for defined sdl options) #define GENERIC_READ (0x80000000L) 2147483648 #define GENERIC_WRITE (0x40000000L) 1073741824 #define GENERIC_EXECUTE (0x20000000L) 536870912 #define GENERIC_ALL (0x10000000L) 268435456 */ pEA[dwCounter].grfAccessPermissions = nPermissions; pEA[dwCounter].grfAccessMode = accessMode; pEA[dwCounter].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; #pragma prefast(push) #pragma prefast(disable:25029) ::BuildTrusteeWithSidW(&(pEA[dwCounter].Trustee), psid); #pragma prefast(pop) } // create a new ACL that contains the ACE *ppACL = NULL; #pragma prefast(push) #pragma prefast(disable:25029) nErrorReturn = ::SetEntriesInAclW(dwCounter, pEA, NULL, ppACL); #pragma prefast(pop) ExitOnFailure(hr = HRESULT_FROM_WIN32(nErrorReturn), "failed to allocate ACL"); LExit: if (psid) { AclFreeSid(psid); } ReleaseMem(pEA); return hr; }
static BOOL STATUSBAR_SetTextT (STATUS_INFO *infoPtr, INT nPart, WORD style, LPWSTR text, BOOL isW) { STATUSWINDOWPART *part=NULL; BOOL changed = FALSE; INT oldStyle; if (style & SBT_OWNERDRAW) { TRACE("part %d, text %p\n",nPart,text); } else TRACE("part %d, text %s\n", nPart, debugstr_t(text, isW)); /* MSDN says: "If the parameter is set to SB_SIMPLEID (255), the status * window is assumed to be a simple window */ if (nPart == 0x00ff) { part = &infoPtr->part0; } else { if (infoPtr->parts && nPart >= 0 && nPart < infoPtr->numParts) { part = &infoPtr->parts[nPart]; } } if (!part) return FALSE; if (part->style != style) changed = TRUE; oldStyle = part->style; part->style = style; if (style & SBT_OWNERDRAW) { if (!(oldStyle & SBT_OWNERDRAW)) Free (part->text); part->text = text; } else { LPWSTR ntext; WCHAR *idx; if (text && !isW) { LPCSTR atxt = (LPCSTR)text; DWORD len = MultiByteToWideChar( CP_ACP, 0, atxt, -1, NULL, 0 ); ntext = Alloc( (len + 1)*sizeof(WCHAR) ); if (!ntext) return FALSE; MultiByteToWideChar( CP_ACP, 0, atxt, -1, ntext, len ); } else if (text) { ntext = Alloc( (strlenW(text) + 1)*sizeof(WCHAR) ); if (!ntext) return FALSE; strcpyW (ntext, text); } else ntext = 0; /* replace nonprintable characters with spaces */ if (ntext) { idx = ntext; while (*idx) { if(!isprintW(*idx)) *idx = ' '; idx++; } } /* check if text is unchanged -> no need to redraw */ if (text) { if (!changed && part->text && !lstrcmpW(ntext, part->text)) { Free(ntext); return TRUE; } } else { if (!changed && !part->text) return TRUE; } if (!(oldStyle & SBT_OWNERDRAW)) Free (part->text); part->text = ntext; } InvalidateRect(infoPtr->Self, &part->bound, FALSE); UpdateWindow(infoPtr->Self); return TRUE; }
static void CRYPT_RegReadSerializedFromReg(HKEY key, DWORD contextType, HCERTSTORE store) { LONG rc; DWORD index = 0; WCHAR subKeyName[MAX_PATH]; do { DWORD size = sizeof(subKeyName) / sizeof(WCHAR); rc = RegEnumKeyExW(key, index++, subKeyName, &size, NULL, NULL, NULL, NULL); if (!rc) { HKEY subKey; rc = RegOpenKeyExW(key, subKeyName, 0, KEY_READ, &subKey); if (!rc) { LPBYTE buf = NULL; size = 0; rc = RegQueryValueExW(subKey, BlobW, NULL, NULL, NULL, &size); if (!rc) buf = CryptMemAlloc(size); if (buf) { rc = RegQueryValueExW(subKey, BlobW, NULL, NULL, buf, &size); if (!rc) { const void *context; DWORD addedType; TRACE("Adding cert with hash %s\n", debugstr_w(subKeyName)); context = CRYPT_ReadSerializedElement(buf, size, contextType, &addedType); if (context) { const WINE_CONTEXT_INTERFACE *contextInterface; BYTE hash[20]; switch (addedType) { case CERT_STORE_CERTIFICATE_CONTEXT: contextInterface = pCertInterface; break; case CERT_STORE_CRL_CONTEXT: contextInterface = pCRLInterface; break; case CERT_STORE_CTL_CONTEXT: contextInterface = pCTLInterface; break; default: contextInterface = NULL; } if (contextInterface) { size = sizeof(hash); if (contextInterface->getProp(context, CERT_HASH_PROP_ID, hash, &size)) { WCHAR asciiHash[20 * 2 + 1]; CRYPT_HashToStr(hash, asciiHash); TRACE("comparing %s\n", debugstr_w(asciiHash)); TRACE("with %s\n", debugstr_w(subKeyName)); if (!lstrcmpW(asciiHash, subKeyName)) { TRACE("hash matches, adding\n"); contextInterface->addContextToStore( store, context, CERT_STORE_ADD_REPLACE_EXISTING, NULL); } else TRACE("hash doesn't match, ignoring\n"); } Context_Release(context_from_ptr(context)); } } } CryptMemFree(buf); } RegCloseKey(subKey); } /* Ignore intermediate errors, continue enumerating */ rc = ERROR_SUCCESS; } } while (!rc); }
static void test_font_events_disp(void) { static const WCHAR nameW[] = {'N','a','m','e',0}; static const WCHAR sizeW[] = {'S','i','z','e',0}; static const WCHAR boldW[] = {'B','o','l','d',0}; static const WCHAR italicW[] = {'I','t','a','l','i','c',0}; static const WCHAR underlineW[] = {'U','n','d','e','r','l','i','n','e',0}; static const WCHAR strikeW[] = {'S','t','r','i','k','e','t','h','r','o','u','g','h',0}; static const WCHAR weightW[] = {'W','e','i','g','h','t',0}; static const WCHAR charsetW[] = {'C','h','a','r','s','e','t',0}; static const struct font_dispid font_dispids[] = { { DISPID_FONT_NAME, nameW }, { DISPID_FONT_SIZE, sizeW }, { DISPID_FONT_BOLD, boldW }, { DISPID_FONT_ITALIC, italicW }, { DISPID_FONT_UNDER, underlineW }, { DISPID_FONT_STRIKE, strikeW }, { DISPID_FONT_WEIGHT, weightW }, { DISPID_FONT_CHARSET, charsetW } }; IFont *pFont; IFont *pFont2; IConnectionPointContainer *pCPC; IConnectionPoint *pCP; FONTDESC fontdesc; HRESULT hr; DWORD dwCookie; IFontDisp *pFontDisp; DISPPARAMS dispparams; VARIANTARG vararg; INT i; fontdesc.cbSizeofstruct = sizeof(fontdesc); fontdesc.lpstrName = MSSansSerif_font; fontdesc.cySize.int64 = 12 * 10000; /* 12 pt */ fontdesc.sWeight = FW_NORMAL; fontdesc.sCharset = 0; fontdesc.fItalic = FALSE; fontdesc.fUnderline = FALSE; fontdesc.fStrikethrough = FALSE; hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&pFont); EXPECT_HR(hr, S_OK); hr = IFont_QueryInterface(pFont, &IID_IConnectionPointContainer, (void **)&pCPC); EXPECT_HR(hr, S_OK); hr = IConnectionPointContainer_FindConnectionPoint(pCPC, &IID_IFontEventsDisp, &pCP); EXPECT_HR(hr, S_OK); IConnectionPointContainer_Release(pCPC); hr = IConnectionPoint_Advise(pCP, (IUnknown *)&FontEventsDisp, &dwCookie); EXPECT_HR(hr, S_OK); IConnectionPoint_Release(pCP); fonteventsdisp_invoke_called = 0; fonteventsdisp_invoke_arg0 = NULL; hr = IFont_put_Bold(pFont, TRUE); EXPECT_HR(hr, S_OK); ok(fonteventsdisp_invoke_called == 1, "IFontEventDisp::Invoke wasn't called once\n"); SysFreeString(fonteventsdisp_invoke_arg0); hr = IFont_QueryInterface(pFont, &IID_IFontDisp, (void **)&pFontDisp); EXPECT_HR(hr, S_OK); for (i = 0; i < sizeof(font_dispids)/sizeof(font_dispids[0]); i++) { switch (font_dispids[i].dispid) { case DISPID_FONT_NAME: { static const WCHAR arialW[] = {'A','r','i','a','l',0}; V_VT(&vararg) = VT_BSTR; V_BSTR(&vararg) = SysAllocString(arialW); break; } case DISPID_FONT_SIZE: V_VT(&vararg) = VT_CY; S(V_CY(&vararg)).Lo = 25; S(V_CY(&vararg)).Hi = 0; break; case DISPID_FONT_BOLD: V_VT(&vararg) = VT_BOOL; V_BOOL(&vararg) = VARIANT_FALSE; break; case DISPID_FONT_ITALIC: case DISPID_FONT_UNDER: case DISPID_FONT_STRIKE: V_VT(&vararg) = VT_BOOL; V_BOOL(&vararg) = VARIANT_TRUE; break; case DISPID_FONT_WEIGHT: V_VT(&vararg) = VT_I2; V_I2(&vararg) = FW_BLACK; break; case DISPID_FONT_CHARSET: V_VT(&vararg) = VT_I2; V_I2(&vararg) = 1; break; default: ; } dispparams.cNamedArgs = 0; dispparams.rgdispidNamedArgs = NULL; dispparams.cArgs = 1; dispparams.rgvarg = &vararg; fonteventsdisp_invoke_called = 0; hr = IFontDisp_Invoke(pFontDisp, font_dispids[i].dispid, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); ok(hr == S_OK, "dispid=%d, got 0x%08x\n", font_dispids[i].dispid, hr); ok(fonteventsdisp_invoke_called == 1, "dispid=%d, DISPID_FONT_CHANGED not called, got %d\n", font_dispids[i].dispid, fonteventsdisp_invoke_called); if (hr == S_OK) { ok(!lstrcmpW(font_dispids[i].name, fonteventsdisp_invoke_arg0), "dispid=%d, got %s, expected %s\n", font_dispids[i].dispid, wine_dbgstr_w(fonteventsdisp_invoke_arg0), wine_dbgstr_w(font_dispids[i].name)); SysFreeString(fonteventsdisp_invoke_arg0); } VariantClear(&vararg); } IFontDisp_Release(pFontDisp); hr = IFont_Clone(pFont, &pFont2); EXPECT_HR(hr, S_OK); IFont_Release(pFont); /* this test shows that the notification routine isn't called again */ fonteventsdisp_invoke_called = 0; hr = IFont_put_Bold(pFont2, FALSE); EXPECT_HR(hr, S_OK); ok(fonteventsdisp_invoke_called == 0, "got %d\n", fonteventsdisp_invoke_called); IFont_Release(pFont2); }
void DoOpenFile(LPCWSTR szFileName, ENCODING enc) { static const WCHAR dotlog[] = { '.','L','O','G',0 }; HANDLE hFile; LPSTR pTemp; DWORD size; DWORD dwNumRead; int lenW; WCHAR* textW; int i; WCHAR log[5]; /* Close any files and prompt to save changes */ if (!DoCloseFile()) return; hFile = CreateFileW(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { AlertFileNotFound(szFileName); return; } size = GetFileSize(hFile, NULL); if (size == INVALID_FILE_SIZE) { CloseHandle(hFile); ShowLastError(); return; } /* Extra memory for (WCHAR)'\0'-termination. */ pTemp = HeapAlloc(GetProcessHeap(), 0, size+2); if (!pTemp) { CloseHandle(hFile); ShowLastError(); return; } if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) { CloseHandle(hFile); HeapFree(GetProcessHeap(), 0, pTemp); ShowLastError(); return; } CloseHandle(hFile); size = dwNumRead; if (enc == ENCODING_AUTO) enc = detect_encoding_of_buffer(pTemp, size); else if (size >= 2 && (enc==ENCODING_UTF16LE || enc==ENCODING_UTF16BE)) { /* If UTF-16 (BE or LE) is selected, and there is a UTF-16 BOM, * override the selection (like native Notepad). */ if ((BYTE)pTemp[0] == 0xff && (BYTE)pTemp[1] == 0xfe) enc = ENCODING_UTF16LE; else if ((BYTE)pTemp[0] == 0xfe && (BYTE)pTemp[1] == 0xff) enc = ENCODING_UTF16BE; } switch (enc) { case ENCODING_UTF16BE: byteswap_wide_string((WCHAR*) pTemp, size/sizeof(WCHAR)); /* Forget whether the file is BE or LE, like native Notepad. */ enc = ENCODING_UTF16LE; /* fall through */ case ENCODING_UTF16LE: textW = (LPWSTR)pTemp; lenW = size/sizeof(WCHAR); break; default: { int cp = (enc==ENCODING_UTF8) ? CP_UTF8 : CP_ACP; lenW = MultiByteToWideChar(cp, 0, pTemp, size, NULL, 0); textW = HeapAlloc(GetProcessHeap(), 0, (lenW+1) * sizeof(WCHAR)); if (!textW) { ShowLastError(); HeapFree(GetProcessHeap(), 0, pTemp); return; } MultiByteToWideChar(cp, 0, pTemp, size, textW, lenW); HeapFree(GetProcessHeap(), 0, pTemp); break; } } /* Replace '\0's with spaces. Other than creating a custom control that * can deal with '\0' characters, it's the best that can be done. */ for (i = 0; i < lenW; i++) if (textW[i] == '\0') textW[i] = ' '; textW[lenW] = '\0'; if (lenW >= 1 && textW[0] == 0xfeff) SetWindowTextW(Globals.hEdit, textW+1); else SetWindowTextW(Globals.hEdit, textW); HeapFree(GetProcessHeap(), 0, textW); SendMessageW(Globals.hEdit, EM_SETMODIFY, FALSE, 0); SendMessageW(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); SetFocus(Globals.hEdit); /* If the file starts with .LOG, add a time/date at the end and set cursor after */ if (GetWindowTextW(Globals.hEdit, log, ARRAY_SIZE(log)) && !lstrcmpW(log, dotlog)) { static const WCHAR lfW[] = { '\r','\n',0 }; SendMessageW(Globals.hEdit, EM_SETSEL, GetWindowTextLengthW(Globals.hEdit), -1); SendMessageW(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); DIALOG_EditTimeDate(); SendMessageW(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); } SetFileNameAndEncoding(szFileName, enc); UpdateWindowCaption(); }
static int control(struct ao *ao, enum aocontrol cmd, void *arg) { struct wasapi_state *state = (struct wasapi_state *)ao->priv; ao_control_vol_t *vol = (ao_control_vol_t *)arg; BOOL mute; switch (cmd) { case AOCONTROL_GET_VOLUME: if (state->opt_exclusive) IAudioEndpointVolume_GetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, &state->audio_volume); else ISimpleAudioVolume_GetMasterVolume(state->pAudioVolumeProxy, &state->audio_volume); /* check to see if user manually changed volume through mixer; this information is used in exclusive mode for restoring the mixer volume on uninit */ if (state->audio_volume != state->previous_volume) { MP_VERBOSE(state, "mixer difference: %.2g now, expected %.2g\n", state->audio_volume, state->previous_volume); state->initial_volume = state->audio_volume; } vol->left = vol->right = 100.0f * state->audio_volume; return CONTROL_OK; case AOCONTROL_SET_VOLUME: state->audio_volume = vol->left / 100.f; if (state->opt_exclusive) IAudioEndpointVolume_SetMasterVolumeLevelScalar(state->pEndpointVolumeProxy, state->audio_volume, NULL); else ISimpleAudioVolume_SetMasterVolume(state->pAudioVolumeProxy, state->audio_volume, NULL); state->previous_volume = state->audio_volume; return CONTROL_OK; case AOCONTROL_GET_MUTE: if (state->opt_exclusive) IAudioEndpointVolume_GetMute(state->pEndpointVolumeProxy, &mute); else ISimpleAudioVolume_GetMute(state->pAudioVolumeProxy, &mute); *(bool*)arg = mute; return CONTROL_OK; case AOCONTROL_SET_MUTE: mute = *(bool*)arg; if (state->opt_exclusive) IAudioEndpointVolume_SetMute(state->pEndpointVolumeProxy, mute, NULL); else ISimpleAudioVolume_SetMute(state->pAudioVolumeProxy, mute, NULL); return CONTROL_OK; case AOCONTROL_HAS_PER_APP_VOLUME: return CONTROL_TRUE; case AOCONTROL_UPDATE_STREAM_TITLE: { MP_VERBOSE(state, "Updating stream title to \"%s\"\n", (char*)arg); wchar_t *title = mp_from_utf8(NULL, (char*)arg); wchar_t *tmp = NULL; /* There is a weird race condition in the IAudioSessionControl itself -- it seems that *sometimes* the SetDisplayName does not take effect and it still shows the old title. Use this loop to insist until it works. */ do { IAudioSessionControl_SetDisplayName(state->pSessionControlProxy, title, NULL); SAFE_RELEASE(tmp, CoTaskMemFree(tmp)); IAudioSessionControl_GetDisplayName(state->pSessionControlProxy, &tmp); } while (lstrcmpW(title, tmp)); SAFE_RELEASE(tmp, CoTaskMemFree(tmp)); talloc_free(title); return CONTROL_OK; } default: return CONTROL_UNKNOWN; } }
static void test_about_protocol(void) { IInternetProtocolInfo *protocol_info; IUnknown *unk; IClassFactory *factory; HRESULT hres; hres = CoGetClassObject(&CLSID_AboutProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres); if(FAILED(hres)) return; hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&protocol_info); ok(hres == S_OK, "Could not get IInternetProtocolInfo interface: %08x\n", hres); if(SUCCEEDED(hres)) { WCHAR buf[128]; DWORD size; int i; for(i = PARSE_CANONICALIZE; i <= PARSE_UNESCAPE; i++) { if(i != PARSE_SECURITY_URL && i != PARSE_DOMAIN) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, i, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == INET_E_DEFAULT_ACTION, "[%d] failed: %08x, expected INET_E_DEFAULT_ACTION\n", i, hres); } } hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, PARSE_SECURITY_URL, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == S_OK, "ParseUrl failed: %08x\n", hres); ok(!lstrcmpW(about_blank_url, buf), "buf != blank_url\n"); size = 0xdeadbeef; hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, PARSE_SECURITY_URL, 0, buf, 3, &size, 0); ok(hres == S_FALSE, "ParseUrl failed: %08x, expected S_FALSE\n", hres); ok(size == 12, "size = %d\n", size); hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_test_url, PARSE_SECURITY_URL, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == S_OK, "ParseUrl failed: %08x\n", hres); ok(!lstrcmpW(about_test_url, buf), "buf != test_url\n"); ok(size == 11, "size = %d\n", size); size = 0xdeadbeef; buf[0] = '?'; hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, PARSE_DOMAIN, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres); ok(buf[0] == '?', "buf changed\n"); ok(size == sizeof(about_blank_url)/sizeof(WCHAR) || size == sizeof(buf)/sizeof(buf[0]), /* IE8 */ "size=%d\n", size); if (0) { /* Crashes on windows */ size = 0xdeadbeef; buf[0] = '?'; hres = IInternetProtocolInfo_ParseUrl(protocol_info, NULL, PARSE_DOMAIN, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == E_FAIL, "ParseUrl failed: %08x\n", hres); ok(buf[0] == '?', "buf changed\n"); ok(size == 1, "size=%u, expected 1\n", size); buf[0] = '?'; hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, PARSE_DOMAIN, 0, buf, sizeof(buf)/sizeof(buf[0]), NULL, 0); ok(hres == E_POINTER, "ParseUrl failed: %08x\n", hres); ok(buf[0] == '?', "buf changed\n"); buf[0] = '?'; hres = IInternetProtocolInfo_ParseUrl(protocol_info, NULL, PARSE_DOMAIN, 0, buf, sizeof(buf)/sizeof(buf[0]), NULL, 0); ok(hres == E_POINTER, "ParseUrl failed: %08x\n", hres); ok(buf[0] == '?', "buf changed\n"); } hres = IInternetProtocolInfo_ParseUrl(protocol_info, about_blank_url, PARSE_UNESCAPE+1, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == INET_E_DEFAULT_ACTION, "ParseUrl failed: %08x, expected INET_E_DEFAULT_ACTION\n", hres); size = 0xdeadbeef; hres = IInternetProtocolInfo_CombineUrl(protocol_info, about_blank_url, about_test_url, 0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER, "CombineUrl failed: %08x\n", hres); ok(size == 0xdeadbeef, "size=%d\n", size); size = 0xdeadbeef; hres = IInternetProtocolInfo_CombineUrl(protocol_info, about_blank_url, about_test_url, URL_FILE_USE_PATHURL, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER, "CombineUrl failed: %08x\n", hres); ok(size == 0xdeadbeef, "size=%d\n", size); size = 0xdeadbeef; hres = IInternetProtocolInfo_CombineUrl(protocol_info, NULL, NULL, URL_FILE_USE_PATHURL, buf, sizeof(buf)/sizeof(buf[0]), &size, 0); ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER, "CombineUrl failed: %08x\n", hres); ok(size == 0xdeadbeef, "size=%d\n", size); hres = IInternetProtocolInfo_CompareUrl(protocol_info, about_blank_url, about_blank_url, 0); ok(hres == E_NOTIMPL, "CompareUrl failed: %08x\n", hres); hres = IInternetProtocolInfo_CompareUrl(protocol_info, NULL, NULL, 0xdeadbeef); ok(hres == E_NOTIMPL, "CompareUrl failed: %08x\n", hres); for(i=0; i<30; i++) { switch(i) { case QUERY_CAN_NAVIGATE: case QUERY_USES_NETWORK: case QUERY_IS_CACHED: case QUERY_IS_INSTALLEDENTRY: case QUERY_IS_CACHED_OR_MAPPED: case QUERY_IS_SECURE: case QUERY_IS_SAFE: case QUERY_USES_HISTORYFOLDER: case QUERY_IS_CACHED_AND_USABLE_OFFLINE: break; default: hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, i, 0, buf, sizeof(buf), &size, 0); ok(hres == E_FAIL, "QueryInfo(%d) returned: %08x, expected E_FAIL\n", i, hres); } } hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, QUERY_CAN_NAVIGATE, 0, buf, sizeof(buf), &size, 0); ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER || hres == E_FAIL, /* win2k */ "QueryInfo returned: %08x, expected INET_E_USE_DEFAULT_PROTOCOLHANDLER or E_FAIL\n", hres); size = 0xdeadbeef; memset(buf, '?', sizeof(buf)); hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), &size, 0); ok(hres == S_OK, "QueryInfo(QUERY_USES_NETWORK) failed: %08x\n", hres); ok(size == sizeof(DWORD), "size=%d\n", size); ok(!*(DWORD*)buf, "buf=%d\n", *(DWORD*)buf); memset(buf, '?', sizeof(buf)); hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), NULL, 0); ok(hres == S_OK, "QueryInfo(QUERY_USES_NETWORK) failed: %08x\n", hres); ok(!*(DWORD*)buf, "buf=%d\n", *(DWORD*)buf); hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, QUERY_USES_NETWORK, 0, buf, 3, &size, 0); ok(hres == E_FAIL, "QueryInfo(QUERY_USES_NETWORK) failed: %08x, expected E_FAIL\n", hres); hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, QUERY_USES_NETWORK, 0, NULL, sizeof(buf), &size, 0); ok(hres == E_FAIL, "QueryInfo(QUERY_USES_NETWORK) failed: %08x, expected E_FAIL\n", hres); hres = IInternetProtocolInfo_QueryInfo(protocol_info, about_blank_url, 60, 0, NULL, sizeof(buf), &size, 0); ok(hres == E_FAIL, "QueryInfo failed: %08x, expected E_FAIL\n", hres); IInternetProtocolInfo_Release(protocol_info); } hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)&factory); ok(hres == S_OK, "Could not get IClassFactory interface\n"); if(SUCCEEDED(hres)) { do_test_about_protocol(factory, 0); do_test_about_protocol(factory, BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NEEDFILE); IClassFactory_Release(factory); } IUnknown_Release(unk); }
HRESULT ScaWriteWebError(IMSAdminBase* piMetabase, int iParentType, LPCWSTR wzRoot, SCA_WEB_ERROR* psweList) { // AssertSz(0, "Debug ScaWriteWebError here"); Assert(*wzRoot && psweList); HRESULT hr = S_OK; DWORD cchData = 0; LPWSTR pwzSearchKey = NULL; LPWSTR pwz = NULL; LPWSTR pwzErrors = NULL; LPWSTR pwzCodeSubCode = NULL; LPWSTR pwzAcceptableCodeSubCode = NULL; LPCWSTR wzFoundCodeSubCode = NULL; DWORD_PTR dwFoundCodeSubCodeIndex = 0xFFFFFFFF; BOOL fOldValueFound = FALSE; LPWSTR pwzAcceptableErrors = NULL; LPWSTR pwzNewError = NULL; METADATA_RECORD mr; ::ZeroMemory(&mr, sizeof(mr)); ExitOnNull(piMetabase, hr, E_INVALIDARG, "Failed to write web error, because no metabase was provided"); ExitOnNull(wzRoot, hr, E_INVALIDARG, "Failed to write web error, because no root was provided"); // get the set of all valid custom errors from the metabase mr.dwMDIdentifier = MD_CUSTOM_ERROR_DESC; mr.dwMDAttributes = METADATA_INHERIT; mr.dwMDUserType = IIS_MD_UT_SERVER; mr.dwMDDataType = ALL_METADATA; mr.dwMDDataLen = cchData = 0; mr.pbMDData = NULL; hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, L"/LM/W3SVC/Info", &mr); ExitOnFailure(hr, "Unable to get set of acceptable error codes for this server."); pwzAcceptableErrors = reinterpret_cast<LPWSTR>(mr.pbMDData); // Check if web errors already exist here mr.dwMDIdentifier = MD_CUSTOM_ERROR; mr.dwMDAttributes = METADATA_INHERIT; mr.dwMDUserType = IIS_MD_UT_SERVER; mr.dwMDDataType = ALL_METADATA; mr.dwMDDataLen = cchData = 0; mr.pbMDData = NULL; hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, wzRoot, &mr); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr) { // // If we don't have one already, find an appropriate one to start with // // we can walk up key by key and look for custom errors to inherit hr = StrAllocConcat(&pwzSearchKey, wzRoot, 0); ExitOnFailure1(hr, "Failed to copy root string: %ls", wzRoot); pwz = pwzSearchKey + lstrlenW(pwzSearchKey); while (NULL == pwzErrors) { // find the last slash while (*pwz != '/' && pwz != pwzSearchKey) pwz --; if (pwz == pwzSearchKey) break; *pwz = L'\0'; // Try here. If it's not found, keep walking up the path hr = MetaGetValue(piMetabase, METADATA_MASTER_ROOT_HANDLE, pwzSearchKey, &mr); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || MD_ERROR_DATA_NOT_FOUND == hr) hr = S_FALSE; ExitOnFailure1(hr, "failed to discover default error values to start with for web root: %ls while walking up the tree", wzRoot); if (S_OK == hr) { pwzErrors = reinterpret_cast<LPWSTR>(mr.pbMDData); break; } // Don't keep going if we're at the root if (0 == lstrcmpW(pwz + 1, L"W3SVC")) break; } } else { pwzErrors = reinterpret_cast<LPWSTR>(mr.pbMDData); } ExitOnFailure1(hr, "failed to discover default error values to start with for web root: %ls", wzRoot); // The above code should have come up with some value to start pwzErrors off with. Make sure it did. if (NULL == pwzErrors) { ExitOnFailure1(hr = E_UNEXPECTED, "failed to discover default error values to start with for web root: %ls", wzRoot); } // Loop through the web errors for (SCA_WEB_ERROR* pswe = psweList; pswe; pswe = pswe->psweNext) { // Assume that we will have to replace fOldValueFound = TRUE; // If the subcode is 0, that means "*" in MD_CUSTOM_ERROR (thus the special formatting logic) if (0 == pswe->iSubCode) { hr = StrAllocFormatted(&pwzCodeSubCode, L"%d,*", pswe->iErrorCode); ExitOnFailure(hr, "failed to create error code string while installing web error"); } else { hr = StrAllocFormatted(&pwzCodeSubCode, L"%d,%d", pswe->iErrorCode, pswe->iSubCode); ExitOnFailure(hr, "failed to create error code,subcode string while installing web error"); } hr = MultiSzFindSubstring(pwzErrors, pwzCodeSubCode, &dwFoundCodeSubCodeIndex, &wzFoundCodeSubCode); ExitOnFailure1(hr, "failed to find existing error code,subcode: %ls", pwzCodeSubCode); // If we didn't find this error code/sub code pair in the list already, make sure it's acceptable to add if (S_FALSE == hr) { // // Make sure this error code/sub code pair is in the "acceptable" list // // If the subcode is 0, that means "0" in MD_CUSTOM_ERROR_DESC (no special formatting logic needed) hr = StrAllocFormatted(&pwzAcceptableCodeSubCode, L"%d,%d", pswe->iErrorCode, pswe->iSubCode); ExitOnFailure(hr, "failed to create error code,subcode string while installing web error"); // We don't care where it is, just whether it's there or not hr = MultiSzFindSubstring(pwzAcceptableErrors, pwzAcceptableCodeSubCode, NULL, NULL); ExitOnFailure1(hr, "failed to find whether or not error code, subcode: %ls is supported", pwzCodeSubCode); if (S_FALSE == hr) { WcaLog(LOGMSG_VERBOSE, "Skipping error code, subcode: %ls because it is not supported by the server.", pwzCodeSubCode); continue; } // If we didn't find it (and its an acceptable error) then we have nothing to replace fOldValueFound = FALSE; } // Set up the new error string if needed if (*(pswe->wzFile)) { hr = StrAllocFormatted(&pwzNewError, L"%s,FILE,%s", pwzCodeSubCode, pswe->wzFile); ExitOnFailure2(hr, "failed to create new error code string with code,subcode: %ls, file: %ls", pwzCodeSubCode, pswe->wzFile); } else if (*(pswe->wzURL)) { hr = StrAllocFormatted(&pwzNewError, L"%s,URL,%s", pwzCodeSubCode, pswe->wzURL); ExitOnFailure2(hr, "failed to create new error code string with code,subcode: %ls, file: %ls", pwzCodeSubCode, pswe->wzFile); } else if (fOldValueFound) { // If no File or URL was specified, they want a default error so remove the old value from the MULTISZ and move on hr = MultiSzRemoveString(&pwzErrors, dwFoundCodeSubCodeIndex); ExitOnFailure1(hr, "failed to remove string for error code sub code: %ls in order to make it 'default'", pwzCodeSubCode); continue; } // If we have something to replace, replace it, otherwise, put it at the beginning (order shouldn't matter) if (fOldValueFound) { hr = MultiSzReplaceString(&pwzErrors, dwFoundCodeSubCodeIndex, pwzNewError); ExitOnFailure1(hr, "failed to replace old error string with new error string for error code,subcode: %ls", pwzCodeSubCode); } else { hr = MultiSzPrepend(&pwzErrors, NULL, pwzNewError); ExitOnFailure1(hr, "failed to prepend new error string for error code,subcode: %ls", pwzCodeSubCode); } } // now write the CustomErrors to the metabase if (weptWeb == iParentType) { hr = ScaWriteMetabaseValue(piMetabase, wzRoot, L"/Root", MD_CUSTOM_ERROR, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, pwzErrors); ExitOnFailure(hr, "Failed to write Web Error to /Root"); } else { hr = ScaWriteMetabaseValue(piMetabase, wzRoot, NULL, MD_CUSTOM_ERROR, METADATA_INHERIT, IIS_MD_UT_FILE, MULTISZ_METADATA, pwzErrors); ExitOnFailure(hr, "Failed to write Web Error"); } LExit: ReleaseStr(pwzErrors); ReleaseStr(pwzSearchKey); ReleaseStr(pwzCodeSubCode); ReleaseStr(pwzAcceptableCodeSubCode); ReleaseStr(pwzAcceptableErrors); return hr; }
/***************************************************************************** wmain *****************************************************************************/ DWORD __cdecl wmain( int argc, LPWSTR argv[] ) { HRESULT hr = S_FALSE; int i=0; LPCWSTR wszFile = NULL; SIGN_PARA Para = {0}; Para.wszCanonicalizationMethod = wszURI_CANONICALIZATION_EXSLUSIVE_C14N; Para.wszHashAlgName = BCRYPT_SHA1_ALGORITHM; // // Options // for( i=1; i<argc; i++ ) { if ( 0 == lstrcmpW (argv[i], L"/?") || 0 == lstrcmpW (argv[i], L"-?") ) { Usage(); goto CleanUp; } if( *argv[i] != L'-' ) break; if ( 0 == lstrcmpW (argv[i], L"-kv") ) { Para.fKV = TRUE; } else if ( 0 == lstrcmpW (argv[i], L"-cm") ) { if( i+1 >= argc ) { goto InvalidCommandLine; } Para.wszCanonicalizationMethod = argv[++i]; } else if ( 0 == lstrcmpW (argv[i], L"-h") ) { if( i+1 >= argc ) { goto InvalidCommandLine; } Para.wszHashAlgName = argv[++i]; } else if ( 0 == lstrcmpW (argv[i], L"-n") ) { if( i+1 >= argc ) { goto InvalidCommandLine; } Para.wszSubject = argv[++i]; } else if ( 0 == lstrcmpW (argv[i], L"-kid") ) { if( i+1 >= argc ) { goto InvalidCommandLine; } Para.wszKeyInfoId = argv[++i]; } else if ( 0 == lstrcmpW (argv[i], L"-sid") ) { if( i+1 >= argc ) { goto InvalidCommandLine; } Para.wszSignatureId = argv[++i]; } } // // Commands // if( i >= argc ) { goto InvalidCommandLine; } if( 0 == lstrcmpW( argv[i], WSZ_CMD_VERIFY )) { i++; if( i >= argc ) { goto InvalidCommandLine; } wszFile = argv[i]; hr = HrVerify( wszFile ); if( FAILED(hr) ) { goto CleanUp; } } else if( 0 == lstrcmpW( argv[i], WSZ_CMD_SIGN )) { i++; if( i+1 >= argc ) { goto InvalidCommandLine; } wszFile = argv[i++]; if( L'#' != *argv[i] ) { if( i+2 >= argc ) { goto InvalidCommandLine; } Para.wszFileIn = argv[i++]; Para.wszSignatureLocation = argv[i++]; } if( i >= argc ) { goto InvalidCommandLine; } // The rest of the command line must be {#Reference| [File] } hr = HrSign( wszFile, &Para, (ULONG)(argc-i), &argv[i] ); if( FAILED(hr) ) { goto CleanUp; } } else { goto InvalidCommandLine; } // // End // hr = S_OK; goto CleanUp; InvalidCommandLine: wprintf( L"ERROR: Invalid command line.\r\n" ); CleanUp: if( FAILED(hr) ) { wprintf( L"ERROR: 0x%08x\r\n", hr ); } return 0; }
static void test_OleUIAddVerbMenu(void) { static const WCHAR cadabraW[] = {'c','a','d','a','b','r','a',0}; HMENU hMenu, verbmenu; MENUITEMINFOW info; WCHAR buffW[50]; int count; BOOL ret; ret = OleUIAddVerbMenuW(NULL, NULL, NULL, 0, 0, 0, FALSE, 0, NULL); ok(!ret, "got %d\n", ret); verbmenu = (HMENU)0xdeadbeef; ret = OleUIAddVerbMenuW(NULL, NULL, NULL, 0, 0, 0, FALSE, 0, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); g_enumpos = 0; ret = OleUIAddVerbMenuW(&oleobject, NULL, NULL, 0, 0, 0, FALSE, 0, NULL); ok(!ret, "got %d\n", ret); hMenu = CreatePopupMenu(); memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); ret = InsertMenuItemW(hMenu, 0, TRUE, &info); ok(ret, "got %d\n", ret); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); g_enumpos = 0; ret = OleUIAddVerbMenuW(&oleobject, NULL, hMenu, 0, 0, 0, FALSE, 0, NULL); ok(!ret, "got %d\n", ret); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); ret = InsertMenuItemW(hMenu, 0, TRUE, &info); ok(ret, "got %d\n", ret); count = GetMenuItemCount(hMenu); ok(count == 2, "got %d\n", count); verbmenu = (HMENU)0xdeadbeef; g_enumpos = 0; ret = OleUIAddVerbMenuW(&oleobject, NULL, hMenu, 1, 0, 0, FALSE, 0, &verbmenu); ok(ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); count = GetMenuItemCount(hMenu); ok(count == 2, "got %d\n", count); /* object doesn't support EnumVerbs() */ g_enumverbsfail = TRUE; g_enumpos = 0; verbmenu = (HMENU)0xdeadbeef; ret = OleUIAddVerbMenuW(&oleobject, NULL, hMenu, 2, 0, 0, FALSE, 0, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); g_enumverbsfail = FALSE; /* added disabled item */ memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); info.fMask = MIIM_STATE|MIIM_SUBMENU; ret = GetMenuItemInfoW(hMenu, 2, TRUE, &info); ok(ret, "got %d\n", ret); ok(info.fState & MFS_DISABLED, "got state 0x%08x\n", info.fState); ok(info.hSubMenu == NULL, "got submenu %p\n", info.hSubMenu); count = GetMenuItemCount(hMenu); ok(count == 3, "got %d\n", count); /* now without object */ verbmenu = (HMENU)0xdeadbeef; ret = OleUIAddVerbMenuW(NULL, testW, hMenu, 3, 42, 0, FALSE, 0, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); info.fMask = MIIM_STATE|MIIM_ID|MIIM_STRING|MIIM_SUBMENU; info.dwTypeData = buffW; info.cch = sizeof(buffW)/sizeof(WCHAR); ret = GetMenuItemInfoW(hMenu, 3, TRUE, &info); ok(ret, "got %d\n", ret); ok(info.fState == MF_GRAYED, "got state 0x%08x\n", info.fState); ok(info.wID == 42, "got id %d\n", info.wID); ok(info.hSubMenu == NULL, "got submenu %p\n", info.hSubMenu); count = GetMenuItemCount(hMenu); ok(count == 4, "got %d\n", count); verbmenu = (HMENU)0xdeadbeef; g_enumpos = 0; ret = OleUIAddVerbMenuW(&oleobject, NULL, hMenu, 4, 0, 0, FALSE, 0, &verbmenu); ok(ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); /* check newly added item */ memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); info.fMask = MIIM_STRING|MIIM_STATE|MIIM_SUBMENU; info.dwTypeData = buffW; info.cch = sizeof(buffW)/sizeof(WCHAR); ret = GetMenuItemInfoW(hMenu, 4, TRUE, &info); ok(ret, "got %d\n", ret); /* Item string contains verb, usertype and localized string for 'Object' word, exact format depends on localization. */ ok(strstrW(buffW, verbW) != NULL, "str %s\n", wine_dbgstr_w(buffW)); ok(info.fState == 0, "got state 0x%08x\n", info.fState); ok(info.hSubMenu == NULL, "got submenu %p\n", info.hSubMenu); count = GetMenuItemCount(hMenu); ok(count == 5, "got %d\n", count); DestroyMenu(hMenu); /* try to add verb menu repeatedly, with same id */ hMenu = CreatePopupMenu(); count = GetMenuItemCount(hMenu); ok(count == 0, "got %d\n", count); verbmenu = NULL; ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); verbmenu = NULL; ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); /* same position, different id */ verbmenu = NULL; ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 6, 10, TRUE, 3, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); /* change added item string and state */ memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); info.fMask = MIIM_STRING|MIIM_STATE; info.fState = MFS_ENABLED; info.dwTypeData = buffW; lstrcpyW(buffW, cadabraW); ret = SetMenuItemInfoW(hMenu, 0, TRUE, &info); ok(ret, "got %d\n", ret); buffW[0] = 0; GetMenuStringW(hMenu, 0, buffW, sizeof(buffW)/sizeof(buffW[0]), MF_BYPOSITION); ok(!lstrcmpW(buffW, cadabraW), "got %s\n", wine_dbgstr_w(buffW)); verbmenu = NULL; ret = OleUIAddVerbMenuW(NULL, NULL, hMenu, 0, 5, 10, TRUE, 3, &verbmenu); ok(!ret, "got %d\n", ret); ok(verbmenu == NULL, "got %p\n", verbmenu); memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); info.fMask = MIIM_STRING|MIIM_STATE; buffW[0] = 0; info.dwTypeData = buffW; info.cch = sizeof(buffW)/sizeof(WCHAR); ret = GetMenuItemInfoW(hMenu, 0, TRUE, &info); ok(ret, "got %d\n", ret); ok(lstrcmpW(buffW, cadabraW), "got %s\n", wine_dbgstr_w(buffW)); ok(info.fState == MF_GRAYED, "got state 0x%08x\n", info.fState); count = GetMenuItemCount(hMenu); ok(count == 1, "got %d\n", count); DestroyMenu(hMenu); }
HRESULT CpiFindCollectionObject( ICatalogCollection* piColl, LPCWSTR pwzID, LPCWSTR pwzName, ICatalogObject** ppiObj ) { HRESULT hr = S_OK; IDispatch* piDisp = NULL; ICatalogObject* piObj = NULL; VARIANT vtVal; ::VariantInit(&vtVal); long lCnt; hr = piColl->get_Count(&lCnt); ExitOnFailure(hr, "Failed to get to number of items in collection"); for (long i = 0; i < lCnt; i++) { // get ICatalogObject interface hr = piColl->get_Item(i, &piDisp); ExitOnFailure(hr, "Failed to get object from collection"); hr = piDisp->QueryInterface(IID_ICatalogObject, (void**)&piObj); ExitOnFailure(hr, "Failed to get IID_ICatalogObject interface"); // compare id if (pwzID && *pwzID) { hr = piObj->get_Key(&vtVal); ExitOnFailure(hr, "Failed to get key"); hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR); ExitOnFailure(hr, "Failed to change variant type"); if (0 == lstrcmpiW(vtVal.bstrVal, pwzID)) { if (ppiObj) { *ppiObj = piObj; piObj = NULL; } ExitFunction1(hr = S_OK); } ::VariantClear(&vtVal); } // compare name if (pwzName && *pwzName) { hr = piObj->get_Name(&vtVal); ExitOnFailure(hr, "Failed to get name"); hr = ::VariantChangeType(&vtVal, &vtVal, 0, VT_BSTR); ExitOnFailure(hr, "Failed to change variant type"); if (0 == lstrcmpW(vtVal.bstrVal, pwzName)) { if (ppiObj) { *ppiObj = piObj; piObj = NULL; } ExitFunction1(hr = S_OK); } ::VariantClear(&vtVal); } // release interface pointers ReleaseNullObject(piDisp); ReleaseNullObject(piObj); } hr = S_FALSE; LExit: // clean up ReleaseObject(piDisp); ReleaseObject(piObj); ::VariantClear(&vtVal); return hr; }
static void test_Language(void) { static const WCHAR vbW[] = {'V','B','S','c','r','i','p','t',0}; static const WCHAR jsW[] = {'J','S','c','r','i','p','t',0}; static const WCHAR vb2W[] = {'v','B','s','c','r','i','p','t',0}; static const WCHAR dummyW[] = {'d','u','m','m','y',0}; IScriptControl *sc; HRESULT hr; BSTR str; hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IScriptControl, (void**)&sc); ok(hr == S_OK, "got 0x%08x\n", hr); todo_wine { hr = IScriptControl_get_Language(sc, NULL); ok(hr == E_POINTER, "got 0x%08x\n", hr); str = (BSTR)0xdeadbeef; hr = IScriptControl_get_Language(sc, &str); ok(hr == S_OK, "got 0x%08x\n", hr); if (hr == S_OK) ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); str = SysAllocString(vbW); hr = IScriptControl_put_Language(sc, str); ok(hr == S_OK, "got 0x%08x\n", hr); SysFreeString(str); str = SysAllocString(vb2W); hr = IScriptControl_put_Language(sc, str); ok(hr == S_OK, "got 0x%08x\n", hr); SysFreeString(str); hr = IScriptControl_get_Language(sc, &str); ok(hr == S_OK, "got 0x%08x\n", hr); ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); SysFreeString(str); str = SysAllocString(dummyW); hr = IScriptControl_put_Language(sc, str); ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr); SysFreeString(str); hr = IScriptControl_get_Language(sc, &str); ok(hr == S_OK, "got 0x%08x\n", hr); if (hr == S_OK) ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str)); SysFreeString(str); str = SysAllocString(jsW); hr = IScriptControl_put_Language(sc, str); ok(hr == S_OK, "got 0x%08x\n", hr); SysFreeString(str); hr = IScriptControl_get_Language(sc, &str); if (hr == S_OK) ok(!lstrcmpW(str, jsW), "got %s\n", wine_dbgstr_w(str)); SysFreeString(str); hr = IScriptControl_put_Language(sc, NULL); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IScriptControl_get_Language(sc, &str); ok(hr == S_OK, "got 0x%08x\n", hr); ok(str == NULL, "got %s\n", wine_dbgstr_w(str)); IScriptControl_Release(sc); } /* custom script engine */ if (register_script_engine()) { static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0}; hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IScriptControl, (void**)&sc); ok(hr == S_OK, "got 0x%08x\n", hr); todo_wine { SET_EXPECT(CreateInstance); SET_EXPECT(SetInterfaceSafetyOptions); SET_EXPECT(SetScriptSite); SET_EXPECT(InitNew); str = SysAllocString(testscriptW); hr = IScriptControl_put_Language(sc, str); ok(hr == S_OK, "got 0x%08x\n", hr); SysFreeString(str); CHECK_CALLED(CreateInstance); CHECK_CALLED(SetInterfaceSafetyOptions); CHECK_CALLED(SetScriptSite); CHECK_CALLED(InitNew); hr = IScriptControl_get_Language(sc, &str); ok(hr == S_OK, "got 0x%08x\n", hr); if (hr == S_OK) ok(!lstrcmpW(testscriptW, str), "%s\n", wine_dbgstr_w(str)); SysFreeString(str); init_registry(FALSE); SET_EXPECT(Close); IScriptControl_Release(sc); CHECK_CALLED(Close); } } else
static void test_media_streams(void) { IAMMultiMediaStream *pams; HRESULT hr; IMediaStream *video_stream = NULL; IMediaStream *audio_stream = NULL; IMediaStream *dummy_stream; IMediaStreamFilter* media_stream_filter = NULL; if (!(pams = create_ammultimediastream())) return; if (!create_directdraw()) { IAMMultiMediaStream_Release(pams); return; } hr = IAMMultiMediaStream_Initialize(pams, STREAMTYPE_READ, 0, NULL); ok(hr == S_OK, "IAMMultiMediaStream_Initialize returned: %x\n", hr); /* Retrieve media stream filter */ hr = IAMMultiMediaStream_GetFilter(pams, NULL); ok(hr == E_POINTER, "IAMMultiMediaStream_GetFilter returned: %x\n", hr); hr = IAMMultiMediaStream_GetFilter(pams, &media_stream_filter); ok(hr == S_OK, "IAMMultiMediaStream_GetFilter returned: %x\n", hr); /* Verify behaviour with invalid purpose id */ hr = IAMMultiMediaStream_GetMediaStream(pams, &IID_IUnknown, &dummy_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &IID_IUnknown, 0, NULL); ok(hr == MS_E_PURPOSEID, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); /* Verify there is no video media stream */ hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryVideo, &video_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* Verify there is no default renderer for video stream */ hr = IAMMultiMediaStream_AddMediaStream(pams, (IUnknown*)pdd7, &MSPID_PrimaryVideo, AMMSF_ADDDEFAULTRENDERER, NULL); ok(hr == MS_E_PURPOSEID, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryVideo, &video_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &MSPID_PrimaryVideo, AMMSF_ADDDEFAULTRENDERER, NULL); ok(hr == MS_E_PURPOSEID, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryVideo, &video_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* Verify normal case for video stream */ hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &MSPID_PrimaryVideo, 0, NULL); ok(hr == S_OK, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryVideo, &video_stream); ok(hr == S_OK, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* Verify the video stream has been added to the media stream filter */ if (media_stream_filter) { hr = IMediaStreamFilter_GetMediaStream(media_stream_filter, &MSPID_PrimaryVideo, &dummy_stream); ok(hr == S_OK, "IMediaStreamFilter_GetMediaStream returned: %x\n", hr); ok(dummy_stream == video_stream, "Got wrong returned pointer %p, expected %p\n", dummy_stream, video_stream); if (SUCCEEDED(hr)) IMediaStream_Release(dummy_stream); } /* Check interfaces and samples for video */ if (video_stream) { IAMMediaStream* am_media_stream; IMultiMediaStream *multi_media_stream; IAudioMediaStream* audio_media_stream; IDirectDrawMediaStream *ddraw_stream = NULL; IDirectDrawStreamSample *ddraw_sample = NULL; hr = IMediaStream_QueryInterface(video_stream, &IID_IAMMediaStream, (LPVOID*)&am_media_stream); ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); ok((void*)am_media_stream == (void*)video_stream, "Not same interface, got %p expected %p\n", am_media_stream, video_stream); hr = IAMMediaStream_GetMultiMediaStream(am_media_stream, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %x\n", hr); multi_media_stream = (void *)0xdeadbeef; hr = IAMMediaStream_GetMultiMediaStream(am_media_stream, &multi_media_stream); ok(hr == S_OK, "IAMMediaStream_GetMultiMediaStream returned: %x\n", hr); ok((void *)multi_media_stream == (void *)pams, "Expected %p, got %p\n", pams, multi_media_stream); IMultiMediaStream_Release(multi_media_stream); IAMMediaStream_Release(am_media_stream); hr = IMediaStream_QueryInterface(video_stream, &IID_IAudioMediaStream, (LPVOID*)&audio_media_stream); ok(hr == E_NOINTERFACE, "IMediaStream_QueryInterface returned: %x\n", hr); hr = IMediaStream_QueryInterface(video_stream, &IID_IDirectDrawMediaStream, (LPVOID*)&ddraw_stream); ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); if (SUCCEEDED(hr)) { DDSURFACEDESC current_format, desired_format; IDirectDrawPalette *palette; DWORD flags; hr = IDirectDrawMediaStream_GetFormat(ddraw_stream, ¤t_format, &palette, &desired_format, &flags); ok(hr == MS_E_NOSTREAM, "IDirectDrawoMediaStream_GetFormat returned: %x\n", hr); hr = IDirectDrawMediaStream_CreateSample(ddraw_stream, NULL, NULL, 0, &ddraw_sample); ok(hr == S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr); hr = IDirectDrawMediaStream_GetMultiMediaStream(ddraw_stream, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %x\n", hr); multi_media_stream = (void *)0xdeadbeef; hr = IDirectDrawMediaStream_GetMultiMediaStream(ddraw_stream, &multi_media_stream); ok(hr == S_OK, "IDirectDrawMediaStream_GetMultiMediaStream returned: %x\n", hr); ok((void *)multi_media_stream == (void *)pams, "Expected %p, got %p\n", pams, multi_media_stream); IMultiMediaStream_Release(multi_media_stream); } if (ddraw_sample) IDirectDrawStreamSample_Release(ddraw_sample); if (ddraw_stream) IDirectDrawMediaStream_Release(ddraw_stream); } /* Verify there is no audio media stream */ hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryAudio, &audio_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* Verify no stream is created when using the default renderer for audio stream */ hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL); ok((hr == S_OK) || (hr == VFW_E_NO_AUDIO_HARDWARE), "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); if (hr == S_OK) { IGraphBuilder* filtergraph = NULL; IBaseFilter* filter = NULL; const WCHAR name[] = {'0','0','0','1',0}; CLSID clsid; hr = IAMMultiMediaStream_GetFilterGraph(pams, &filtergraph); ok(hr == S_OK, "IAMMultiMediaStream_GetFilterGraph returned: %x\n", hr); if (hr == S_OK) { hr = IGraphBuilder_FindFilterByName(filtergraph, name, &filter); ok(hr == S_OK, "IGraphBuilder_FindFilterByName returned: %x\n", hr); } if (hr == S_OK) { hr = IBaseFilter_GetClassID(filter, &clsid); ok(hr == S_OK, "IGraphBuilder_FindFilterByName returned: %x\n", hr); } if (hr == S_OK) ok(IsEqualGUID(&clsid, &CLSID_DSoundRender), "Got wrong CLSID\n"); if (filter) IBaseFilter_Release(filter); if (filtergraph) IGraphBuilder_Release(filtergraph); } hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryAudio, &audio_stream); ok(hr == MS_E_NOSTREAM, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* Verify a stream is created when no default renderer is used */ hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &MSPID_PrimaryAudio, 0, NULL); ok(hr == S_OK, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryAudio, &audio_stream); ok(hr == S_OK, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); /* verify the audio stream has been added to the media stream filter */ if (media_stream_filter) { hr = IMediaStreamFilter_GetMediaStream(media_stream_filter, &MSPID_PrimaryAudio, &dummy_stream); ok(hr == S_OK, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); ok(dummy_stream == audio_stream, "Got wrong returned pointer %p, expected %p\n", dummy_stream, audio_stream); if (SUCCEEDED(hr)) IMediaStream_Release(dummy_stream); } /* Check interfaces and samples for audio */ if (audio_stream) { IAMMediaStream* am_media_stream; IMultiMediaStream *multi_media_stream; IDirectDrawMediaStream* ddraw_stream = NULL; IAudioMediaStream* audio_media_stream = NULL; IAudioStreamSample *audio_sample = NULL; hr = IMediaStream_QueryInterface(audio_stream, &IID_IAMMediaStream, (LPVOID*)&am_media_stream); ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); ok((void*)am_media_stream == (void*)audio_stream, "Not same interface, got %p expected %p\n", am_media_stream, audio_stream); hr = IAMMediaStream_GetMultiMediaStream(am_media_stream, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %x\n", hr); multi_media_stream = (void *)0xdeadbeef; hr = IAMMediaStream_GetMultiMediaStream(am_media_stream, &multi_media_stream); ok(hr == S_OK, "IAMMediaStream_GetMultiMediaStream returned: %x\n", hr); ok((void *)multi_media_stream == (void *)pams, "Expected %p, got %p\n", pams, multi_media_stream); IMultiMediaStream_Release(multi_media_stream); IAMMediaStream_Release(am_media_stream); hr = IMediaStream_QueryInterface(audio_stream, &IID_IDirectDrawMediaStream, (LPVOID*)&ddraw_stream); ok(hr == E_NOINTERFACE, "IMediaStream_QueryInterface returned: %x\n", hr); hr = IMediaStream_QueryInterface(audio_stream, &IID_IAudioMediaStream, (LPVOID*)&audio_media_stream); ok(hr == S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); if (SUCCEEDED(hr)) { IAudioData* audio_data = NULL; WAVEFORMATEX format; hr = CoCreateInstance(&CLSID_AMAudioData, NULL, CLSCTX_INPROC_SERVER, &IID_IAudioData, (void **)&audio_data); ok(hr == S_OK, "CoCreateInstance returned: %x\n", hr); hr = IAudioMediaStream_GetFormat(audio_media_stream, NULL); ok(hr == E_POINTER, "IAudioMediaStream_GetFormat returned: %x\n", hr); hr = IAudioMediaStream_GetFormat(audio_media_stream, &format); ok(hr == MS_E_NOSTREAM, "IAudioMediaStream_GetFormat returned: %x\n", hr); hr = IAudioMediaStream_CreateSample(audio_media_stream, NULL, 0, &audio_sample); ok(hr == E_POINTER, "IAudioMediaStream_CreateSample returned: %x\n", hr); hr = IAudioMediaStream_CreateSample(audio_media_stream, audio_data, 0, &audio_sample); ok(hr == S_OK, "IAudioMediaStream_CreateSample returned: %x\n", hr); hr = IAudioMediaStream_GetMultiMediaStream(audio_media_stream, NULL); ok(hr == E_POINTER, "Expected E_POINTER, got %x\n", hr); multi_media_stream = (void *)0xdeadbeef; hr = IAudioMediaStream_GetMultiMediaStream(audio_media_stream, &multi_media_stream); ok(hr == S_OK, "IAudioMediaStream_GetMultiMediaStream returned: %x\n", hr); ok((void *)multi_media_stream == (void *)pams, "Expected %p, got %p\n", pams, multi_media_stream); IMultiMediaStream_Release(multi_media_stream); if (audio_data) IAudioData_Release(audio_data); if (audio_sample) IAudioStreamSample_Release(audio_sample); if (audio_media_stream) IAudioMediaStream_Release(audio_media_stream); } } if (media_stream_filter) { IEnumPins *enum_pins; hr = IMediaStreamFilter_EnumPins(media_stream_filter, &enum_pins); ok(hr == S_OK, "IBaseFilter_EnumPins returned: %x\n", hr); if (hr == S_OK) { IPin* pins[3] = { NULL, NULL, NULL }; ULONG nb_pins; ULONG expected_nb_pins = audio_stream ? 2 : 1; int i; hr = IEnumPins_Next(enum_pins, 3, pins, &nb_pins); ok(SUCCEEDED(hr), "IEnumPins_Next returned: %x\n", hr); ok(nb_pins == expected_nb_pins, "Number of pins is %u instead of %u\n", nb_pins, expected_nb_pins); for (i = 0; i < min(nb_pins, expected_nb_pins); i++) { IEnumMediaTypes* enum_media_types; AM_MEDIA_TYPE* media_types[10]; ULONG nb_media_types; IPin* pin; PIN_INFO info; WCHAR id[40]; /* Pin name is "I{guid MSPID_PrimaryVideo or MSPID_PrimaryAudio}" */ id[0] = 'I'; StringFromGUID2(i ? &MSPID_PrimaryAudio : &MSPID_PrimaryVideo, id + 1, 40); hr = IPin_ConnectedTo(pins[i], &pin); ok(hr == VFW_E_NOT_CONNECTED, "IPin_ConnectedTo returned: %x\n", hr); hr = IPin_QueryPinInfo(pins[i], &info); ok(hr == S_OK, "IPin_QueryPinInfo returned: %x\n", hr); IBaseFilter_Release(info.pFilter); ok(info.dir == PINDIR_INPUT, "Pin direction is %u instead of %u\n", info.dir, PINDIR_INPUT); ok(!lstrcmpW(info.achName, id), "Pin name is %s instead of %s\n", wine_dbgstr_w(info.achName), wine_dbgstr_w(id)); hr = IPin_EnumMediaTypes(pins[i], &enum_media_types); ok(hr == S_OK, "IPin_EnumMediaTypes returned: %x\n", hr); hr = IEnumMediaTypes_Next(enum_media_types, sizeof(media_types) / sizeof(media_types[0]), media_types, &nb_media_types); ok(SUCCEEDED(hr), "IEnumMediaTypes_Next returned: %x\n", hr); ok(nb_media_types > 0, "nb_media_types should be >0\n"); IEnumMediaTypes_Release(enum_media_types); IPin_Release(pins[i]); } IEnumPins_Release(enum_pins); } } /* Test open file with no filename */ hr = IAMMultiMediaStream_OpenFile(pams, NULL, 0); ok(hr == E_POINTER, "IAMMultiMediaStream_OpenFile returned %x instead of %x\n", hr, E_POINTER); if (video_stream) IMediaStream_Release(video_stream); if (audio_stream) IMediaStream_Release(audio_stream); if (media_stream_filter) IMediaStreamFilter_Release(media_stream_filter); release_directdraw(); IAMMultiMediaStream_Release(pams); }
static void run_usergetinfo_tests(void) { NET_API_STATUS rc; PUSER_INFO_0 ui0 = NULL; PUSER_INFO_10 ui10 = NULL; DWORD dwSize; if((rc = create_test_user()) != NERR_Success ) { skip("Skipping usergetinfo_tests, create_test_user failed: 0x%08x\n", rc); return; } /* Level 0 */ rc=pNetUserGetInfo(NULL, sTestUserName, 0, (LPBYTE *)&ui0); ok(rc == NERR_Success, "NetUserGetInfo level 0 failed: 0x%08x.\n", rc); ok(!lstrcmpW(sTestUserName, ui0->usri0_name),"Username mismatch for level 0.\n"); pNetApiBufferSize(ui0, &dwSize); ok(dwSize >= (sizeof(USER_INFO_0) + (lstrlenW(ui0->usri0_name) + 1) * sizeof(WCHAR)), "Is allocated with NetApiBufferAllocate\n"); /* Level 10 */ rc=pNetUserGetInfo(NULL, sTestUserName, 10, (LPBYTE *)&ui10); ok(rc == NERR_Success, "NetUserGetInfo level 10 failed: 0x%08x.\n", rc); ok(!lstrcmpW(sTestUserName, ui10->usri10_name), "Username mismatch for level 10.\n"); pNetApiBufferSize(ui10, &dwSize); ok(dwSize >= (sizeof(USER_INFO_10) + (lstrlenW(ui10->usri10_name) + 1 + lstrlenW(ui10->usri10_comment) + 1 + lstrlenW(ui10->usri10_usr_comment) + 1 + lstrlenW(ui10->usri10_full_name) + 1) * sizeof(WCHAR)), "Is allocated with NetApiBufferAllocate\n"); pNetApiBufferFree(ui0); pNetApiBufferFree(ui10); /* NetUserGetInfo should always work for the current user. */ rc=pNetUserGetInfo(NULL, user_name, 0, (LPBYTE*)&ui0); ok(rc == NERR_Success, "NetUsetGetInfo for current user failed: 0x%08x.\n", rc); pNetApiBufferFree(ui0); /* errors handling */ rc=pNetUserGetInfo(NULL, sTestUserName, 10000, (LPBYTE *)&ui0); ok(rc == ERROR_INVALID_LEVEL,"Invalid Level: rc=%d\n",rc); rc=pNetUserGetInfo(NULL, sNonexistentUser, 0, (LPBYTE *)&ui0); ok(rc == NERR_UserNotFound,"Invalid User Name: rc=%d\n",rc); todo_wine { /* FIXME - Currently Wine can't verify whether the network path is good or bad */ rc=pNetUserGetInfo(sBadNetPath, sTestUserName, 0, (LPBYTE *)&ui0); ok(rc == ERROR_BAD_NETPATH || rc == ERROR_NETWORK_UNREACHABLE, "Bad Network Path: rc=%d\n",rc); } rc=pNetUserGetInfo(sEmptyStr, sTestUserName, 0, (LPBYTE *)&ui0); ok(rc == ERROR_BAD_NETPATH || rc == NERR_Success, "Bad Network Path: rc=%d\n",rc); rc=pNetUserGetInfo(sInvalidName, sTestUserName, 0, (LPBYTE *)&ui0); ok(rc == ERROR_INVALID_NAME,"Invalid Server Name: rc=%d\n",rc); rc=pNetUserGetInfo(sInvalidName2, sTestUserName, 0, (LPBYTE *)&ui0); ok(rc == ERROR_INVALID_NAME,"Invalid Server Name: rc=%d\n",rc); if(delete_test_user() != NERR_Success) trace("Deleting the test user failed. You might have to manually delete it.\n"); }
static void test_namespace(void) { static const WCHAR winetestW[] = {'w','i','n','e','t','e','s','t',0}; static const WCHAR backslashW[] = {'\\',0}; static const WCHAR clsidW[] = { ':',':','{','6','4','5','F','F','0','4','0','-','5','0','8','1','-', '1','0','1','B','-','9','F','0','8','-', '0','0','A','A','0','0','2','F','9','5','4','E','}',0}; static WCHAR tempW[MAX_PATH], curW[MAX_PATH]; WCHAR *long_pathW = NULL; HRESULT r; IShellDispatch *sd; Folder *folder; Folder2 *folder2; FolderItem *item; VARIANT var; BSTR title, item_path; int len; r = CoCreateInstance(&CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, &IID_IShellDispatch, (LPVOID*)&sd); if (r == REGDB_E_CLASSNOTREG) /* NT4 */ { win_skip("skipping IShellDispatch tests\n"); return; } ok(SUCCEEDED(r), "CoCreateInstance failed: %08x\n", r); if (FAILED(r)) return; VariantInit(&var); folder = (void*)0xdeadbeef; r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r); ok(folder == NULL, "expected NULL, got %p\n", folder); V_VT(&var) = VT_I4; V_I4(&var) = -1; folder = (void*)0xdeadbeef; r = IShellDispatch_NameSpace(sd, var, &folder); todo_wine { ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r); ok(folder == NULL, "got %p\n", folder); } V_VT(&var) = VT_I4; V_I4(&var) = ssfPROGRAMFILES; r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_OK || broken(r == S_FALSE), /* NT4 */ "IShellDispatch::NameSpace failed: %08x\n", r); if (r == S_OK) { static WCHAR path[MAX_PATH]; if (pSHGetFolderPathW) { r = pSHGetFolderPathW(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, path); ok(r == S_OK, "SHGetFolderPath failed: %08x\n", r); } r = Folder_get_Title(folder, &title); todo_wine ok(r == S_OK, "Folder::get_Title failed: %08x\n", r); if (r == S_OK) { /* On Win2000-2003 title is equal to program files directory name in HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir. On newer Windows it seems constant and is not changed if the program files directory name is changed */ if (pSHGetSpecialFolderLocation && pSHGetNameFromIDList) { LPITEMIDLIST pidl; PWSTR name; r = pSHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidl); ok(r == S_OK, "SHGetSpecialFolderLocation failed: %08x\n", r); r = pSHGetNameFromIDList(pidl, SIGDN_NORMALDISPLAY, &name); ok(r == S_OK, "SHGetNameFromIDList failed: %08x\n", r); todo_wine ok(!lstrcmpW(title, name), "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(title)); CoTaskMemFree(name); CoTaskMemFree(pidl); } else if (pSHGetFolderPathW) { WCHAR *p; p = path + lstrlenW(path); while (path < p && *(p - 1) != '\\') p--; ok(!lstrcmpiW(title, p), "expected %s, got %s\n", wine_dbgstr_w(p), wine_dbgstr_w(title)); } else skip("skipping Folder::get_Title test\n"); SysFreeString(title); } r = Folder_QueryInterface(folder, &IID_Folder2, (LPVOID*)&folder2); ok(r == S_OK, "Folder::QueryInterface failed: %08x\n", r); if (r == S_OK) { r = Folder2_get_Self(folder2, &item); ok(r == S_OK, "Folder::get_Self failed: %08x\n", r); if (r == S_OK) { r = FolderItem_get_Path(item, &item_path); ok(r == S_OK, "FolderItem::get_Path failed: %08x\n", r); if (pSHGetFolderPathW) ok(!lstrcmpiW(item_path, path), "expected %s, got %s\n", wine_dbgstr_w(path), wine_dbgstr_w(item_path)); SysFreeString(item_path); FolderItem_Release(item); } Folder2_Release(folder2); } Folder_Release(folder); } V_VT(&var) = VT_I4; V_I4(&var) = ssfBITBUCKET; r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_OK || broken(r == S_FALSE), /* NT4 */ "IShellDispatch::NameSpace failed: %08x\n", r); if (r == S_OK) { r = Folder_QueryInterface(folder, &IID_Folder2, (LPVOID*)&folder2); ok(r == S_OK || broken(r == E_NOINTERFACE), /* NT4 */ "Folder::QueryInterface failed: %08x\n", r); if (r == S_OK) { r = Folder2_get_Self(folder2, &item); ok(r == S_OK, "Folder::get_Self failed: %08x\n", r); if (r == S_OK) { r = FolderItem_get_Path(item, &item_path); todo_wine ok(r == S_OK, "FolderItem::get_Path failed: %08x\n", r); todo_wine ok(!lstrcmpW(item_path, clsidW), "expected %s, got %s\n", wine_dbgstr_w(clsidW), wine_dbgstr_w(item_path)); SysFreeString(item_path); FolderItem_Release(item); } Folder2_Release(folder2); } Folder_Release(folder); } GetTempPathW(MAX_PATH, tempW); GetCurrentDirectoryW(MAX_PATH, curW); SetCurrentDirectoryW(tempW); CreateDirectoryW(winetestW, NULL); V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(winetestW); r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r); SysFreeString(V_BSTR(&var)); GetFullPathNameW(winetestW, MAX_PATH, tempW, NULL); if (pGetLongPathNameW) { len = pGetLongPathNameW(tempW, NULL, 0); long_pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); if (long_pathW) pGetLongPathNameW(tempW, long_pathW, len); } V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(tempW); r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_OK, "IShellDispatch::NameSpace failed: %08x\n", r); if (r == S_OK) { r = Folder_get_Title(folder, &title); ok(r == S_OK, "Folder::get_Title failed: %08x\n", r); if (r == S_OK) { ok(!lstrcmpW(title, winetestW), "bad title: %s\n", wine_dbgstr_w(title)); SysFreeString(title); } r = Folder_QueryInterface(folder, &IID_Folder2, (LPVOID*)&folder2); ok(r == S_OK || broken(r == E_NOINTERFACE), /* NT4 */ "Folder::QueryInterface failed: %08x\n", r); if (r == S_OK) { r = Folder2_get_Self(folder2, &item); ok(r == S_OK, "Folder::get_Self failed: %08x\n", r); if (r == S_OK) { r = FolderItem_get_Path(item, &item_path); ok(r == S_OK, "FolderItem::get_Path failed: %08x\n", r); if (long_pathW) ok(!lstrcmpW(item_path, long_pathW), "expected %s, got %s\n", wine_dbgstr_w(long_pathW), wine_dbgstr_w(item_path)); SysFreeString(item_path); FolderItem_Release(item); } Folder2_Release(folder2); } Folder_Release(folder); } SysFreeString(V_BSTR(&var)); len = lstrlenW(tempW); if (len < MAX_PATH - 1) { lstrcatW(tempW, backslashW); V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(tempW); r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_OK, "IShellDispatch::NameSpace failed: %08x\n", r); if (r == S_OK) { r = Folder_get_Title(folder, &title); ok(r == S_OK, "Folder::get_Title failed: %08x\n", r); if (r == S_OK) { ok(!lstrcmpW(title, winetestW), "bad title: %s\n", wine_dbgstr_w(title)); SysFreeString(title); } r = Folder_QueryInterface(folder, &IID_Folder2, (LPVOID*)&folder2); ok(r == S_OK || broken(r == E_NOINTERFACE), /* NT4 */ "Folder::QueryInterface failed: %08x\n", r); if (r == S_OK) { r = Folder2_get_Self(folder2, &item); ok(r == S_OK, "Folder::get_Self failed: %08x\n", r); if (r == S_OK) { r = FolderItem_get_Path(item, &item_path); ok(r == S_OK, "FolderItem::get_Path failed: %08x\n", r); if (long_pathW) ok(!lstrcmpW(item_path, long_pathW), "expected %s, got %s\n", wine_dbgstr_w(long_pathW), wine_dbgstr_w(item_path)); SysFreeString(item_path); FolderItem_Release(item); } Folder2_Release(folder2); } Folder_Release(folder); } SysFreeString(V_BSTR(&var)); } HeapFree(GetProcessHeap(), 0, long_pathW); RemoveDirectoryW(winetestW); SetCurrentDirectoryW(curW); IShellDispatch_Release(sd); }
static void initAudioDlg (HWND hDlg) { WCHAR display_str[256], format_str[256], sysdefault_str[256], disabled_str[64]; IMMDeviceEnumerator *devenum; BOOL have_driver = FALSE; HRESULT hr; UINT i; WINE_TRACE("\n"); LoadStringW(GetModuleHandleW(NULL), IDS_AUDIO_DRIVER, format_str, sizeof(format_str) / sizeof(*format_str)); LoadStringW(GetModuleHandleW(NULL), IDS_AUDIO_DRIVER_NONE, disabled_str, sizeof(disabled_str) / sizeof(*disabled_str)); LoadStringW(GetModuleHandleW(NULL), IDS_AUDIO_SYSDEFAULT, sysdefault_str, sizeof(sysdefault_str) / sizeof(*sysdefault_str)); hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&devenum); if(SUCCEEDED(hr)){ PROPVARIANT pv; load_devices(devenum, eRender, &num_render_devs, &render_devs); load_devices(devenum, eCapture, &num_capture_devs, &capture_devs); PropVariantInit(&pv); if(get_driver_name(devenum, &pv) && pv.u.pwszVal[0] != '\0'){ have_driver = TRUE; wnsprintfW(display_str, sizeof(display_str) / sizeof(*display_str), format_str, pv.u.pwszVal); lstrcatW(g_drv_keyW, pv.u.pwszVal); } PropVariantClear(&pv); IMMDeviceEnumerator_Release(devenum); } SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_SETCURSEL, 0, 0); SendDlgItemMessageW(hDlg, IDC_VOICEOUT_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_VOICEOUT_DEVICE, CB_SETCURSEL, 0, 0); SendDlgItemMessageW(hDlg, IDC_AUDIOIN_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_AUDIOIN_DEVICE, CB_SETCURSEL, 0, 0); SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_ADDSTRING, 0, (LPARAM)sysdefault_str); SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_SETCURSEL, 0, 0); i = 0; while (speaker_configs[i].text_id != 0) { WCHAR speaker_str[256]; LoadStringW(GetModuleHandleW(NULL), speaker_configs[i].text_id, speaker_str, sizeof(speaker_str) / sizeof(*speaker_str)); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_SPEAKERS, CB_ADDSTRING, 0, (LPARAM)speaker_str); i++; } if(have_driver){ WCHAR *reg_out_dev, *reg_vout_dev, *reg_in_dev, *reg_vin_dev; BOOL default_dev_found = FALSE; reg_out_dev = get_reg_keyW(HKEY_CURRENT_USER, g_drv_keyW, reg_out_nameW, NULL); reg_vout_dev = get_reg_keyW(HKEY_CURRENT_USER, g_drv_keyW, reg_vout_nameW, NULL); reg_in_dev = get_reg_keyW(HKEY_CURRENT_USER, g_drv_keyW, reg_in_nameW, NULL); reg_vin_dev = get_reg_keyW(HKEY_CURRENT_USER, g_drv_keyW, reg_vin_nameW, NULL); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_DEVICE, CB_SETCURSEL, i, 0); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_SPEAKERS, CB_SETCURSEL, render_devs[i].speaker_config, 0); for(i = 0; i < num_render_devs; ++i){ if(!render_devs[i].id) continue; SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_ADDSTRING, 0, (LPARAM)render_devs[i].name.u.pwszVal); SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_SETITEMDATA, i + 1, (LPARAM)&render_devs[i]); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_DEVICE, CB_ADDSTRING, 0, (LPARAM)render_devs[i].name.u.pwszVal); if(reg_out_dev && !lstrcmpW(render_devs[i].id, reg_out_dev)){ SendDlgItemMessageW(hDlg, IDC_AUDIOOUT_DEVICE, CB_SETCURSEL, i + 1, 0); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_DEVICE, CB_SETCURSEL, i, 0); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_SPEAKERS, CB_SETCURSEL, render_devs[i].speaker_config, 0); default_dev_found = TRUE; } SendDlgItemMessageW(hDlg, IDC_VOICEOUT_DEVICE, CB_ADDSTRING, 0, (LPARAM)render_devs[i].name.u.pwszVal); SendDlgItemMessageW(hDlg, IDC_VOICEOUT_DEVICE, CB_SETITEMDATA, i + 1, (LPARAM)&render_devs[i]); if(reg_vout_dev && !lstrcmpW(render_devs[i].id, reg_vout_dev)) SendDlgItemMessageW(hDlg, IDC_VOICEOUT_DEVICE, CB_SETCURSEL, i + 1, 0); } if(!default_dev_found && num_render_devs > 0){ SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_DEVICE, CB_SETCURSEL, 0, 0); SendDlgItemMessageW(hDlg, IDC_SPEAKERCONFIG_SPEAKERS, CB_SETCURSEL, render_devs[0].speaker_config, 0); } for(i = 0; i < num_capture_devs; ++i){ if(!capture_devs[i].id) continue; SendDlgItemMessageW(hDlg, IDC_AUDIOIN_DEVICE, CB_ADDSTRING, 0, (LPARAM)capture_devs[i].name.u.pwszVal); SendDlgItemMessageW(hDlg, IDC_AUDIOIN_DEVICE, CB_SETITEMDATA, i + 1, (LPARAM)&capture_devs[i]); if(reg_in_dev && !lstrcmpW(capture_devs[i].id, reg_in_dev)) SendDlgItemMessageW(hDlg, IDC_AUDIOIN_DEVICE, CB_SETCURSEL, i + 1, 0); SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_ADDSTRING, 0, (LPARAM)capture_devs[i].name.u.pwszVal); SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_SETITEMDATA, i + 1, (LPARAM)&capture_devs[i]); if(reg_vin_dev && !lstrcmpW(capture_devs[i].id, reg_vin_dev)) SendDlgItemMessageW(hDlg, IDC_VOICEIN_DEVICE, CB_SETCURSEL, i + 1, 0); } HeapFree(GetProcessHeap(), 0, reg_out_dev); HeapFree(GetProcessHeap(), 0, reg_vout_dev); HeapFree(GetProcessHeap(), 0, reg_in_dev); HeapFree(GetProcessHeap(), 0, reg_vin_dev); }else wnsprintfW(display_str, sizeof(display_str) / sizeof(*display_str), format_str, disabled_str); SetDlgItemTextW(hDlg, IDC_AUDIO_DRIVER, display_str); }
int WINAPI lstrcmpWInternal( LPCWSTR lpString1, LPCWSTR lpString2 ) { return lstrcmpW(lpString1, lpString2); }
int FindPIDsWithSocketHandles(POPEN_SOCK_HANDLE_INFO_EX pOSHIEx, DWORD dwSize, DWORD *dwRequired) { // this is the exported deal // if dwSize can accomodate all data, pOSHIEx will contain a OPEN_SOCK_HANDLE_INFO_EX struct // else cbNeeded will be made to the size required of the function POPEN_SOCK_HANDLE_INFO_EX pMyOSHIEx; void* pTmpStore; // because realloc can't garantee that data isn't corrupted DWORD dwRetBufSiz = 0; // PSYSTEM_HANDLE_INFORMATION_EX pshiEx; HANDLE hProcess, hObj = NULL; DWORD cbNeeded = 0, retVal = 0; DWORD i = 0, ObjNameCurBufsz = 0, dwWarnCount = 0, dwNextIndex = 0, j = 0; POBJECT_NAME_INFORMATION pObjNameInfo; BOOL bEntryExists = 0; pshiEx = malloc(sizeof (SYSTEM_HANDLE_INFORMATION_EX)); pMyOSHIEx = malloc(sizeof (OPEN_SOCK_HANDLE_INFO_EX)); pTmpStore = malloc(sizeof (OPEN_SOCK_HANDLE_INFO_EX)); dwRetBufSiz = sizeof (OPEN_SOCK_HANDLE_INFO_EX); if (pshiEx == NULL || pMyOSHIEx == NULL || pTmpStore == NULL) { return FSH_ERROR_NOMEM; } ZeroMemory(pMyOSHIEx, sizeof (OPEN_SOCK_HANDLE_INFO_EX)); /* a bit of init */ FindNtShit(); //DebugMode(TRUE), in our case we've already done it in main.c /* note; if god mode fails, the results will be restricted to processes we have access to */ MyNtQuerySystemInformation(SystemHandleInformation, pshiEx, sizeof (SYSTEM_HANDLE_INFORMATION_EX), &cbNeeded); //get size for handles pshiEx = (PSYSTEM_HANDLE_INFORMATION_EX) realloc(pshiEx, cbNeeded); if (pshiEx == NULL) { return FSH_ERROR_NOMEM; } MyNtQuerySystemInformation(SystemHandleInformation, pshiEx, cbNeeded, // get handles &cbNeeded); pObjNameInfo = malloc(sizeof (OBJECT_NAME_INFORMATION)); ObjNameCurBufsz = sizeof (OBJECT_NAME_INFORMATION); if (pObjNameInfo == NULL) { return FSH_ERROR_NOMEM; } for (i = 0; i < pshiEx->NumberOfHandles; ++i) { // this iterates through enumerated handles hProcess = OpenProcess(PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, // irrelevent due to debug mode FALSE, pshiEx->Information[i].ProcessId); if (hProcess != NULL) /* bring their handles into our process space */ { if (DuplicateHandle(hProcess, (HANDLE) pshiEx->Information[i].Handle, // mingw ddk declares this as a USHORT GetCurrentProcess(), // and thus the compiler warns us of a cast to &hObj, // a different size STANDARD_RIGHTS_REQUIRED, FALSE, 0) != 0) { // get object info ZeroMemory(pObjNameInfo, ObjNameCurBufsz); retVal = MyNtQueryObject(hObj, ObjectNameInformation, pObjNameInfo, ObjNameCurBufsz, &cbNeeded); // i've had issues with this API // seems it uses threads and locks itself up sometimes after multiple calls // it seems to work to just bosh in a SleepEx to wait, or create a new thread with a timeout // if this does lock itself up, the process becomes unkillable (in my experience :\) if (cbNeeded > ObjNameCurBufsz || retVal != 0) { pObjNameInfo = (POBJECT_NAME_INFORMATION) realloc(pObjNameInfo, cbNeeded); if (pObjNameInfo == NULL) { return FSH_ERROR_NOMEM; } ObjNameCurBufsz = cbNeeded; retVal = MyNtQueryObject(hObj, ObjectNameInformation, pObjNameInfo, ObjNameCurBufsz, &cbNeeded); } // at this point we have enough info to query the driver for info on the connection // such as state/endpoint etc if (lstrcmpW(pObjNameInfo->Name.Buffer, L"\\Device\\Tcp") == 0) { // in our case we don't want to add the same pid twice bEntryExists = 0; for (j = 0; j <= pMyOSHIEx->NumberOfEntries; j++) { if (pMyOSHIEx->OpenSockHandleInfo[j].dwPid == pshiEx->Information[i].ProcessId) { bEntryExists = 1; break; } } if (!bEntryExists) { // add our entry to our local copy of retdata pTmpStore = realloc(pTmpStore, dwRetBufSiz); // resize ret buffer if (pTmpStore == NULL) { return FSH_ERROR_NOMEM; } CopyMemory(pTmpStore, pMyOSHIEx, dwRetBufSiz); dwRetBufSiz += sizeof (OPEN_SOCK_HANDLE_INFO); pMyOSHIEx = realloc(pMyOSHIEx, dwRetBufSiz); if (pTmpStore == NULL) { return FSH_ERROR_NOMEM; } CopyMemory(pMyOSHIEx, pTmpStore, dwRetBufSiz - sizeof (OPEN_SOCK_HANDLE_INFO)); pMyOSHIEx->OpenSockHandleInfo[dwNextIndex].dwPid = pshiEx->Information[i].ProcessId; // fill buff info dwNextIndex++; pMyOSHIEx->NumberOfEntries++; } //done adding entry } } else { dwWarnCount++; } // get these alot, they are }// 5 ERROR_ACCESS_DENIED <bemused face> else { dwWarnCount++; } //close handles CloseHandle(hObj); CloseHandle(hProcess); } free(pObjNameInfo); free(pshiEx); free(pTmpStore); if (dwSize >= dwRetBufSiz) { CopyMemory(pOSHIEx, pMyOSHIEx, dwRetBufSiz); } else { *dwRequired = dwRetBufSiz; } free(pMyOSHIEx); return dwWarnCount; }
static void test_inffilelist(void) { static const char inffile2[] = "test2.inf"; static const WCHAR inffile2W[] = {'t','e','s','t','2','.','i','n','f',0}; static const char invalid_inf[] = "invalid.inf"; static const WCHAR invalid_infW[] = {'i','n','v','a','l','i','d','.','i','n','f',0}; static const char *inf = "[Version]\n" "Signature=\"$Chicago$\""; static const char *inf2 = "[Version]\n" "Signature=\"$CHICAGO$\""; static const char *infNT = "[Version]\n" "Signature=\"$WINDOWS NT$\""; WCHAR *p, *ptr; char dirA[MAX_PATH]; WCHAR dir[MAX_PATH] = { 0 }; WCHAR buffer[MAX_PATH] = { 0 }; DWORD expected, outsize; BOOL ret; if(!pSetupGetInfFileListW) { win_skip("SetupGetInfFileListW not present\n"); return; } /* NULL means %windir%\\inf * get the value as reference */ expected = 0; SetLastError(0xdeadbeef); ret = pSetupGetInfFileListW(NULL, INF_STYLE_WIN4, NULL, 0, &expected); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { win_skip("SetupGetInfFileListW not implemented\n"); return; } ok(ret, "expected SetupGetInfFileListW to succeed! Error: %d\n", GetLastError()); ok(expected > 0, "expected required buffersize to be at least 1\n"); /* check if an empty string doesn't behaves like NULL */ outsize = 0; SetLastError(0xdeadbeef); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, NULL, 0, &outsize); ok(!ret, "expected SetupGetInfFileListW to fail!\n"); /* create a private directory, the temp directory may contain some * inf files left over from old installations */ if (!GetTempFileNameA(CURR_DIR, "inftest", 1, dirA)) { win_skip("GetTempFileNameA failed with error %d\n", GetLastError()); return; } if (!CreateDirectoryA(dirA, NULL )) { win_skip("CreateDirectoryA(%s) failed with error %d\n", dirA, GetLastError()); return; } if (!SetCurrentDirectoryA(dirA)) { win_skip("SetCurrentDirectoryA failed with error %d\n", GetLastError()); RemoveDirectoryA(dirA); return; } MultiByteToWideChar(CP_ACP, 0, dirA, -1, dir, MAX_PATH); /* check a not existing directory */ ptr = dir + lstrlenW(dir); MultiByteToWideChar(CP_ACP, 0, "\\not_existent", -1, ptr, MAX_PATH - lstrlenW(dir)); outsize = 0xffffffff; SetLastError(0xdeadbeef); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, NULL, 0, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(outsize == 1, "expected required buffersize to be 1, got %d\n", outsize); ok(ERROR_PATH_NOT_FOUND == GetLastError(), "expected error ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); create_inf_file(inffile, inf); create_inf_file(inffile2, inf); create_inf_file(invalid_inf, "This content does not match the inf file format"); /* pass a filename instead of a directory */ *ptr = '\\'; MultiByteToWideChar(CP_ACP, 0, invalid_inf, -1, ptr+1, MAX_PATH - lstrlenW(dir)); outsize = 0xffffffff; SetLastError(0xdeadbeef); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, NULL, 0, &outsize); ok(!ret, "expected SetupGetInfFileListW to fail!\n"); ok(ERROR_DIRECTORY == GetLastError(), "expected error ERROR_DIRECTORY, got %d\n", GetLastError()); /* make the filename look like directory */ dir[1 + lstrlenW(dir)] = 0; dir[lstrlenW(dir)] = '\\'; SetLastError(0xdeadbeef); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, NULL, 0, &outsize); ok(!ret, "expected SetupGetInfFileListW to fail!\n"); ok(ERROR_DIRECTORY == GetLastError(), "expected error ERROR_DIRECTORY, got %d\n", GetLastError()); /* now check the buffer content of a vaild call */ *ptr = 0; expected = 3 + strlen(inffile) + strlen(inffile2); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, buffer, MAX_PATH, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(expected == outsize, "expected required buffersize to be %d, got %d\n", expected, outsize); for(p = buffer; lstrlenW(p) && (outsize > (p - buffer)); p+=lstrlenW(p) + 1) ok(!lstrcmpW(p,inffile2W) || !lstrcmpW(p,inffileW), "unexpected filename %s\n",wine_dbgstr_w(p)); /* upper case value */ create_inf_file(inffile2, inf2); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, buffer, MAX_PATH, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(expected == outsize, "expected required buffersize to be %d, got %d\n", expected, outsize); for(p = buffer; lstrlenW(p) && (outsize > (p - buffer)); p+=lstrlenW(p) + 1) ok(!lstrcmpW(p,inffile2W) || !lstrcmpW(p,inffileW), "unexpected filename %s\n",wine_dbgstr_w(p)); /* signature Windows NT is also inf style win4 */ create_inf_file(inffile2, infNT); expected = 3 + strlen(inffile) + strlen(inffile2); ret = pSetupGetInfFileListW(dir, INF_STYLE_WIN4, buffer, MAX_PATH, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(expected == outsize, "expected required buffersize to be %d, got %d\n", expected, outsize); for(p = buffer; lstrlenW(p) && (outsize > (p - buffer)); p+=lstrlenW(p) + 1) ok(!lstrcmpW(p,inffile2W) || !lstrcmpW(p,inffileW), "unexpected filename %s\n",wine_dbgstr_w(p)); /* old style */ expected = 2 + strlen(invalid_inf); ret = pSetupGetInfFileListW(dir, INF_STYLE_OLDNT, buffer, MAX_PATH, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(expected == outsize, "expected required buffersize to be %d, got %d\n", expected, outsize); for(p = buffer; lstrlenW(p) && (outsize > (p - buffer)); p+=lstrlenW(p) + 1) ok(!lstrcmpW(p,invalid_infW), "unexpected filename %s\n",wine_dbgstr_w(p)); /* mixed style */ expected = 4 + strlen(inffile) + strlen(inffile2) + strlen(invalid_inf); ret = pSetupGetInfFileListW(dir, INF_STYLE_OLDNT | INF_STYLE_WIN4, buffer, MAX_PATH, &outsize); ok(ret, "expected SetupGetInfFileListW to succeed!\n"); ok(expected == outsize, "expected required buffersize to be %d, got %d\n", expected, outsize); for(p = buffer; lstrlenW(p) && (outsize > (p - buffer)); p+=lstrlenW(p) + 1) ok(!lstrcmpW(p,inffile2W) || !lstrcmpW(p,inffileW) || !lstrcmpW(p,invalid_infW), "unexpected filename %s\n",wine_dbgstr_w(p)); DeleteFileA(inffile); DeleteFileA(inffile2); DeleteFileA(invalid_inf); SetCurrentDirectoryA(CURR_DIR); RemoveDirectoryA(dirA); }
/****************************************************************** CaSchedSecureObjects - entry point for CaReadSecureObjects Custom Action called as Type 1 CustomAction (binary DLL) from Windows Installer in InstallExecuteSequence before CaSecureObjects ******************************************************************/ extern "C" UINT __stdcall SchedSecureObjects( __in MSIHANDLE hInstall ) { // AssertSz(FALSE, "debug SchedSecureObjects"); HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; LPWSTR pwzData = NULL; LPWSTR pwzTable = NULL; LPWSTR pwzTargetPath = NULL; LPWSTR pwzFormattedString = NULL; int iRoot = 0; int iAllUsers = 0; LPWSTR pwzKey = NULL; PMSIHANDLE hView = NULL; PMSIHANDLE hRec = NULL; MSIHANDLE hViewObject = NULL; // Don't free this since it's always a copy of either hViewService or hViewCreateFolder PMSIHANDLE hViewService = NULL; PMSIHANDLE hViewCreateFolder = NULL; PMSIHANDLE hViewFile = NULL; PMSIHANDLE hViewRegistry = NULL; PMSIHANDLE hRecObject = NULL; INSTALLSTATE isInstalled; INSTALLSTATE isAction; LPWSTR pwzCustomActionData = NULL; DWORD cchCustomActionData = 0; DWORD cObjects = 0; eOBJECTTYPE eType = OT_UNKNOWN; // // initialize // hr = WcaInitialize(hInstall, "SchedSecureObjects"); ExitOnFailure(hr, "failed to initialize"); // // loop through all the objects to be secured // hr = WcaOpenExecuteView(wzQUERY_SECUREOBJECTS, &hView); ExitOnFailure(hr, "failed to open view on SecureObjects table"); while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) { hViewObject = NULL; eType = OT_UNKNOWN; hr = WcaGetRecordString(hRec, QSO_TABLE, &pwzTable); ExitOnFailure(hr, "failed to get object table"); // ensure we're looking at a known table if (0 == lstrcmpW(L"ServiceInstall", pwzTable)) { eType = OT_SERVICE; } else if (0 == lstrcmpW(L"CreateFolder", pwzTable)) { eType = OT_FOLDER; } else if (0 == lstrcmpW(L"File", pwzTable)) { eType = OT_FILE; } else if (0 == lstrcmpW(L"Registry", pwzTable)) { eType = OT_REGISTRY; } else { ExitOnFailure1(hr = E_INVALIDARG, "unknown SecureObject.Table: %S", pwzTable); } // if we haven't opened a view on the ServiceInstall/CreateFolder table, do that now if (OT_SERVICE == eType) { if (!hViewService) { hr = WcaTableExists(pwzTable); if (S_FALSE == hr) hr = E_UNEXPECTED; ExitOnFailure1(hr, "failed to open %s table to secure object", pwzTable); hr = WcaOpenView(wzQUERY_SERVICECOMPONENT, &hViewService); ExitOnFailure(hr, "failed to open view on ServiceInstall table"); } hViewObject = hViewService; } else if (OT_FOLDER == eType) { if (!hViewCreateFolder) { hr = WcaTableExists(pwzTable); if (S_FALSE == hr) hr = E_UNEXPECTED; ExitOnFailure1(hr, "failed to open %s table to secure object", pwzTable); hr = WcaOpenView(wzQUERY_CREATEFOLDERCOMPONENT, &hViewCreateFolder); ExitOnFailure(hr, "failed to open view on CreateFolder table"); } hViewObject = hViewCreateFolder; } else if (OT_FILE== eType) { if (!hViewFile) { hr = WcaTableExists(pwzTable); if (S_FALSE == hr) hr = E_UNEXPECTED; ExitOnFailure1(hr, "failed to open %s table to secure object", pwzTable); hr = WcaOpenView(wzQUERY_FILECOMPONENT, &hViewFile); ExitOnFailure(hr, "failed to open view on CreateFolder table"); } hViewObject = hViewFile; } else if (OT_REGISTRY== eType) { if (!hViewRegistry) { hr = WcaTableExists(pwzTable); if (S_FALSE == hr) hr = E_UNEXPECTED; ExitOnFailure1(hr, "failed to open %s table to secure object", pwzTable); hr = WcaOpenView(wzQUERY_REGISTRYCOMPONENT, &hViewRegistry); ExitOnFailure(hr, "failed to open view on CreateFolder table"); } hViewObject = hViewRegistry; } Assert(hViewObject); // execute a view looking for the object's Component_ hr = WcaExecuteView(hViewObject, hRec); ExitOnFailure1(hr, "failed to execute view on %S table", pwzData); hr = WcaFetchSingleRecord(hViewObject, &hRecObject); ExitOnFailure(hr, "failed to fetch Component for secure object"); hr = WcaGetRecordString(hRecObject, QSOC_COMPONENT, &pwzData); ExitOnFailure(hr, "failed to get Component name for secure object"); // // if we are installing this Component // er = ::MsiGetComponentStateW(hInstall, pwzData, &isInstalled, &isAction); ExitOnFailure1(hr = HRESULT_FROM_WIN32(er), "failed to get install state for Component: %S", pwzData); if (WcaIsInstalling(isInstalled, isAction)) { // add the data to the CustomActionData hr = WcaGetRecordString(hRecObject, QSOC_OBJECTNAME, &pwzData); ExitOnFailure(hr, "failed to get name of object"); if (OT_SERVICE == eType) { hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); } else if (OT_FOLDER == eType) { hr = WcaGetTargetPath(pwzData, &pwzTargetPath); ExitOnFailure1(hr, "failed to get target path for directory id: %S", pwzData); hr = WcaWriteStringToCaData(pwzTargetPath, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); } else if (OT_FILE == eType) { hr = StrAllocFormatted(&pwzFormattedString, L"[#%s]", pwzData); ExitOnFailure1(hr, "failed to create formatted string for securing file object: %S", pwzData); hr = WcaGetFormattedString(pwzFormattedString, &pwzTargetPath); ExitOnFailure2(hr, "failed to get file path from formatted string: %S for secure object: %S", pwzFormattedString, pwzData); hr = WcaWriteStringToCaData(pwzTargetPath, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); } else if (OT_REGISTRY == eType) { hr = WcaGetRecordInteger(hRecObject, QSOC_REGROOT, &iRoot); ExitOnFailure1(hr, "Failed to get reg key root for secure object: %S", pwzData); hr = WcaGetRecordFormattedString(hRecObject, QSOC_REGKEY, &pwzKey); ExitOnFailure1(hr, "Failed to get reg key for secure object: %S", pwzData); // Decode the root value if (-1 == iRoot) { // They didn't specify a root so that means it's either HKCU or HKLM depending on ALLUSERS property hr = WcaGetIntProperty(L"ALLUSERS", &iAllUsers); ExitOnFailure(hr, "failed to get value of ALLUSERS property"); if (1 == iAllUsers) { hr = StrAllocString(&pwzTargetPath, L"MACHINE\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKLM root"); } else { hr = StrAllocString(&pwzTargetPath, L"CURRENT_USER\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKCU root"); } } else if (/*msidbRegistryRootClassesRoot*/ 0 == iRoot) { hr = StrAllocString(&pwzTargetPath, L"CLASSES_ROOT\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKCR root"); } else if (/*msidbRegistryRootCurrentUser*/ 1 == iRoot) { hr = StrAllocString(&pwzTargetPath, L"CURRENT_USER\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKCU root"); } else if (/*msidbRegistryRootLocalMachine*/ 2 == iRoot) { hr = StrAllocString(&pwzTargetPath, L"MACHINE\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKLM root"); } else if (/*msidbRegistryRootUsers*/ 3 == iRoot) { hr = StrAllocString(&pwzTargetPath, L"USERS\\", 0); ExitOnFailure(hr, "failed to allocate target registry string with HKU root"); } else { ExitOnFailure2(hr = E_UNEXPECTED, "Unknown registry key root specified for secure object: '%S' root: %d", pwzData, iRoot); } hr = StrAllocConcat(&pwzTargetPath, pwzKey, 0); ExitOnFailure2(hr, "Failed to concat key: %S for secure object: %S", pwzKey, pwzData); hr = WcaWriteStringToCaData(pwzTargetPath, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); } else { AssertSz(FALSE, "How did you get here?"); } hr = WcaWriteStringToCaData(pwzTable, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); hr = WcaGetRecordFormattedString(hRec, QSO_DOMAIN, &pwzData); ExitOnFailure(hr, "failed to get domain for user to configure object"); hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); hr = WcaGetRecordFormattedString(hRec, QSO_USER, &pwzData); ExitOnFailure(hr, "failed to get user to configure object"); hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); hr = WcaGetRecordString(hRec, QSO_PERMISSION, &pwzData); ExitOnFailure(hr, "failed to get domain for user to configure object"); hr = WcaWriteStringToCaData(pwzData, &pwzCustomActionData); ExitOnFailure(hr, "failed to add data to CustomActionData"); cObjects++; } } // if we looped through all records all is well if (E_NOMOREITEMS == hr) hr = S_OK; ExitOnFailure(hr, "failed while looping through all objects to secure"); // // schedule the custom action and add to progress bar // if (pwzCustomActionData && *pwzCustomActionData) { Assert(0 < cObjects); hr = WcaDoDeferredAction(L"ExecSecureObjects", pwzCustomActionData, cObjects * COST_SECUREOBJECT); ExitOnFailure(hr, "failed to schedule ExecSecureObjects action"); } LExit: ReleaseStr(pwzCustomActionData); ReleaseStr(pwzData); ReleaseStr(pwzTable); ReleaseStr(pwzTargetPath); ReleaseStr(pwzFormattedString); ReleaseStr(pwzKey); if (FAILED(hr)) er = ERROR_INSTALL_FAILURE; return WcaFinalize(er); }
// Return 0 if not changed, 1 if changed, 2 if removed int TrackChange(HANDLE hContact, DBCONTACTWRITESETTING *cws_new, BOOL ignore_remove) { char current_setting[256]; mir_snprintf(current_setting, MAX_REGS(current_setting), "%sCurrent", cws_new->szSetting); int ret = 0; DBVARIANT dbv = {0}; #ifdef UNICODE BOOL found_current = (DBGetContactSettingW(hContact, cws_new->szModule, current_setting, &dbv) == 0); #else BOOL found_current = (DBGetContactSetting(hContact, cws_new->szModule, current_setting, &dbv) == 0); #endif if (!found_current) { // Current value does not exist if (cws_new->value.type == DBVT_DELETED) { ret = 0; } else if (cws_new->value.type == DBVT_ASCIIZ) { ret = CheckStr(cws_new->value.pszVal, 1, 0); } #ifdef UNICODE else if (cws_new->value.type == DBVT_UTF8) { ret = CheckStr(cws_new->value.pszVal, 1, 0); } else if (cws_new->value.type == DBVT_WCHAR) { ret = CheckStr(cws_new->value.pwszVal, 1, 0); } #endif else { ret = 1; } } else { // Current value exist if (cws_new->value.type == DBVT_DELETED) { if (dbv.type == DBVT_ASCIIZ) { ret = CheckStr(dbv.pszVal, 2, 0); } #ifdef UNICODE else if (dbv.type == DBVT_UTF8) { ret = CheckStr(dbv.pszVal, 2, 0); } else if (dbv.type == DBVT_WCHAR) { ret = CheckStr(dbv.pwszVal, 2, 0); } #endif else { ret = 2; } } else if (dbv.type != cws_new->value.type) { #ifdef UNICODE if ( (cws_new->value.type == DBVT_UTF8 || cws_new->value.type == DBVT_ASCIIZ || cws_new->value.type == DBVT_WCHAR) && (dbv.type == DBVT_UTF8 || dbv.type == DBVT_ASCIIZ || dbv.type == DBVT_WCHAR)) { WCHAR tmp_cws_new[1024] = L""; if (cws_new->value.type == DBVT_ASCIIZ) MultiByteToWideChar(CP_ACP, 0, cws_new->value.pszVal, -1, tmp_cws_new, MAX_REGS(tmp_cws_new)); else if (cws_new->value.type == DBVT_UTF8) MultiByteToWideChar(CP_UTF8, 0, cws_new->value.pszVal, -1, tmp_cws_new, MAX_REGS(tmp_cws_new)); else if (cws_new->value.type == DBVT_WCHAR) lstrcpyn(tmp_cws_new, cws_new->value.pwszVal, MAX_REGS(tmp_cws_new)); WCHAR tmp_dbv[1024] = L""; if (dbv.type == DBVT_ASCIIZ) MultiByteToWideChar(CP_ACP, 0, dbv.pszVal, -1, tmp_dbv, MAX_REGS(tmp_dbv)); else if (dbv.type == DBVT_UTF8) MultiByteToWideChar(CP_UTF8, 0, dbv.pszVal, -1, tmp_dbv, MAX_REGS(tmp_dbv)); else if (dbv.type == DBVT_WCHAR) lstrcpyn(tmp_dbv, dbv.pwszVal, MAX_REGS(tmp_dbv)); ret = (lstrcmpW(tmp_cws_new, tmp_dbv) ? CheckStr(tmp_cws_new, 1, 2) : 0); } else #endif { ret = 1; } } else if (dbv.type == DBVT_BYTE) { ret = (cws_new->value.bVal != dbv.bVal ? 1 : 0); } else if (dbv.type == DBVT_WORD) { ret = (cws_new->value.wVal != dbv.wVal ? 1 : 0); } else if (dbv.type == DBVT_DWORD) { ret = (cws_new->value.dVal != dbv.dVal ? 1 : 0); } else if (dbv.type == DBVT_ASCIIZ) { ret = (strcmp(cws_new->value.pszVal, dbv.pszVal) ? CheckStr(cws_new->value.pszVal, 1, 2) : 0); } #ifdef UNICODE else if (dbv.type == DBVT_UTF8) { ret = (strcmp(cws_new->value.pszVal, dbv.pszVal) ? CheckStr(cws_new->value.pszVal, 1, 2) : 0); } else if (dbv.type == DBVT_WCHAR) { ret = (lstrcmp(cws_new->value.pwszVal, dbv.pwszVal) ? CheckStr(cws_new->value.pwszVal, 1, 2) : 0); } #endif } if (ret == 1 || (ret == 2 && !ignore_remove)) { // Copy current to old char old_setting[256]; mir_snprintf(old_setting, MAX_REGS(old_setting), "%sOld", cws_new->szSetting); if (dbv.type == DBVT_DELETED) { DBDeleteContactSetting(hContact, cws_new->szModule, old_setting); } else { DBCONTACTWRITESETTING cws_old; cws_old.szModule = cws_new->szModule; cws_old.szSetting = old_setting; cws_old.value = dbv; CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws_old); } // Copy new to current if (cws_new->value.type == DBVT_DELETED) { DBDeleteContactSetting(hContact, cws_new->szModule, current_setting); } else { DBCONTACTWRITESETTING cws_old; cws_old.szModule = cws_new->szModule; cws_old.szSetting = current_setting; cws_old.value = cws_new->value; CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&cws_old); } } if (found_current) DBFreeVariant(&dbv); return ret; }
/****************************************************************************** * Sets the value with name val_name to the data in val_data for the currently * opened key. * * Parameters: * val_name - name of the registry value * val_data - registry value data */ static LONG setValue(WCHAR* val_name, WCHAR* val_data, BOOL is_unicode) { LONG res; DWORD dwDataType, dwParseType; LPBYTE lpbData; DWORD dwData, dwLen; WCHAR del[] = {'-',0}; if ( (val_name == NULL) || (val_data == NULL) ) return ERROR_INVALID_PARAMETER; if (lstrcmpW(val_data, del) == 0) { res=RegDeleteValueW(currentKeyHandle,val_name); return (res == ERROR_FILE_NOT_FOUND ? ERROR_SUCCESS : res); } /* Get the data type stored into the value field */ dwDataType = getDataType(&val_data, &dwParseType); if (dwParseType == REG_SZ) /* no conversion for string */ { REGPROC_unescape_string(val_data); /* Compute dwLen after REGPROC_unescape_string because it may * have changed the string length and we don't want to store * the extra garbage in the registry. */ dwLen = lstrlenW(val_data); if(val_data[dwLen-1] != '"') return ERROR_INVALID_DATA; if (dwLen>0 && val_data[dwLen-1]=='"') { dwLen--; val_data[dwLen]='\0'; } lpbData = (BYTE*) val_data; dwLen++; /* include terminating null */ dwLen = dwLen * sizeof(WCHAR); /* size is in bytes */ } else if (dwParseType == REG_DWORD) /* Convert the dword types */ { if (!convertHexToDWord(val_data, &dwData)) return ERROR_INVALID_DATA; lpbData = (BYTE*)&dwData; dwLen = sizeof(dwData); } else if (dwParseType == REG_BINARY) /* Convert the binary data */ { lpbData = convertHexCSVToHex(val_data, &dwLen); if (!lpbData) return ERROR_INVALID_DATA; if((dwDataType == REG_MULTI_SZ || dwDataType == REG_EXPAND_SZ) && !is_unicode) { LPBYTE tmp = lpbData; lpbData = (LPBYTE)GetWideStringN((char*)lpbData, dwLen, &dwLen); dwLen *= sizeof(WCHAR); HeapFree(GetProcessHeap(), 0, tmp); } } else /* unknown format */ { fprintf(stderr,"%s: ERROR, unknown data format\n", getAppName()); return ERROR_INVALID_DATA; } res = RegSetValueExW( currentKeyHandle, val_name, 0, /* Reserved */ dwDataType, lpbData, dwLen); if (dwParseType == REG_BINARY) HeapFree(GetProcessHeap(), 0, lpbData); return res; }
static BOOL CALLBACK enumeration_callback(const DIDEVICEINSTANCEA *lpddi, IDirectInputDevice8A *lpdid, DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef) { HRESULT hr; DIPROPDWORD dp; DIPROPRANGE dpr; DIPROPSTRING dps; WCHAR usernameW[MAX_PATH]; DWORD username_size = MAX_PATH; struct enum_data *data = pvRef; DWORD cnt; DIDEVICEOBJECTDATA buffer[5]; IDirectInputDevice8A *lpdid2; if (!data) return DIENUM_CONTINUE; data->ndevices++; /* Convert username to WCHAR */ if (data->username != NULL) { username_size = MultiByteToWideChar(CP_ACP, 0, data->username, -1, usernameW, 0); MultiByteToWideChar(CP_ACP, 0, data->username, -1, usernameW, username_size); } else GetUserNameW(usernameW, &username_size); /* collect the mouse and keyboard */ if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysKeyboard)) { IDirectInputDevice_AddRef(lpdid); data->keyboard = lpdid; ok (dwFlags & DIEDBS_MAPPEDPRI1, "Keyboard should be mapped as pri1 dwFlags=%08x\n", dwFlags); } if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysMouse)) { IDirectInputDevice_AddRef(lpdid); data->mouse = lpdid; ok (dwFlags & DIEDBS_MAPPEDPRI1, "Mouse should be mapped as pri1 dwFlags=%08x\n", dwFlags); } /* Creating second device object to check if it has the same username */ hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &lpdid2, NULL); ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); /* Building and setting an action map */ /* It should not use any pre-stored mappings so we use DIDBAM_HWDEFAULTS */ hr = IDirectInputDevice8_BuildActionMap(lpdid, data->lpdiaf, NULL, DIDBAM_HWDEFAULTS); ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr); /* Device has no data format and thus can't be acquired */ hr = IDirectInputDevice8_Acquire(lpdid); ok (hr == DIERR_INVALIDPARAM, "Device was acquired before SetActionMap hr=%08x\n", hr); hr = IDirectInputDevice8_SetActionMap(lpdid, data->lpdiaf, data->username, 0); ok (SUCCEEDED(hr), "SetActionMap failed hr=%08x\n", hr); /* Some joysticks may have no suitable actions and thus should not be tested */ if (hr == DI_NOEFFECT) return DIENUM_CONTINUE; /* Test username after SetActionMap */ dps.diph.dwSize = sizeof(dps); dps.diph.dwHeaderSize = sizeof(DIPROPHEADER); dps.diph.dwObj = 0; dps.diph.dwHow = DIPH_DEVICE; dps.wsz[0] = '\0'; hr = IDirectInputDevice_GetProperty(lpdid, DIPROP_USERNAME, &dps.diph); ok (SUCCEEDED(hr), "GetProperty failed hr=%08x\n", hr); ok (!lstrcmpW(usernameW, dps.wsz), "Username not set correctly expected=%s, got=%s\n", wine_dbgstr_w(usernameW), wine_dbgstr_w(dps.wsz)); dps.wsz[0] = '\0'; hr = IDirectInputDevice_GetProperty(lpdid2, DIPROP_USERNAME, &dps.diph); ok (SUCCEEDED(hr), "GetProperty failed hr=%08x\n", hr); ok (!lstrcmpW(usernameW, dps.wsz), "Username not set correctly expected=%s, got=%s\n", wine_dbgstr_w(usernameW), wine_dbgstr_w(dps.wsz)); /* Test buffer size */ memset(&dp, 0, sizeof(dp)); dp.diph.dwSize = sizeof(dp); dp.diph.dwHeaderSize = sizeof(DIPROPHEADER); dp.diph.dwHow = DIPH_DEVICE; hr = IDirectInputDevice_GetProperty(lpdid, DIPROP_BUFFERSIZE, &dp.diph); ok (SUCCEEDED(hr), "GetProperty failed hr=%08x\n", hr); ok (dp.dwData == data->lpdiaf->dwBufferSize, "SetActionMap must set the buffer, buffersize=%d\n", dp.dwData); cnt = 1; hr = IDirectInputDevice_GetDeviceData(lpdid, sizeof(buffer[0]), buffer, &cnt, 0); ok(hr == DIERR_NOTACQUIRED, "GetDeviceData() failed hr=%08x\n", hr); /* Test axis range */ memset(&dpr, 0, sizeof(dpr)); dpr.diph.dwSize = sizeof(dpr); dpr.diph.dwHeaderSize = sizeof(DIPROPHEADER); dpr.diph.dwHow = DIPH_DEVICE; hr = IDirectInputDevice_GetProperty(lpdid, DIPROP_RANGE, &dpr.diph); /* Only test if device supports the range property */ if (SUCCEEDED(hr)) { ok (dpr.lMin == data->lpdiaf->lAxisMin, "SetActionMap must set the min axis range expected=%d got=%d\n", data->lpdiaf->lAxisMin, dpr.lMin); ok (dpr.lMax == data->lpdiaf->lAxisMax, "SetActionMap must set the max axis range expected=%d got=%d\n", data->lpdiaf->lAxisMax, dpr.lMax); } /* SetActionMap has set the data format so now it should work */ hr = IDirectInputDevice8_Acquire(lpdid); ok (SUCCEEDED(hr), "Acquire failed hr=%08x\n", hr); cnt = 1; hr = IDirectInputDevice_GetDeviceData(lpdid, sizeof(buffer[0]), buffer, &cnt, 0); ok(hr == DI_OK, "GetDeviceData() failed hr=%08x\n", hr); /* SetActionMap should not work on an acquired device */ hr = IDirectInputDevice8_SetActionMap(lpdid, data->lpdiaf, NULL, 0); ok (hr == DIERR_ACQUIRED, "SetActionMap succeeded with an acquired device hr=%08x\n", hr); return DIENUM_CONTINUE; }
static int strcmp_wa(const WCHAR *strw, const char *stra) { WCHAR buf[512]; MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(buf[0])); return lstrcmpW(strw, buf); }
DWORD APIENTRY NPAddConnection(LPNETRESOURCEW lpNetResource, LPWSTR lpPassword, LPWSTR lpUserName) { DWORD NpResult; DWORD dwType = lpNetResource->dwType; LPWSTR lpRemoteName = lpNetResource->lpRemoteName; LPWSTR lpLocalName = lpNetResource->lpLocalName; WCHAR LocalNameBuf[3]; PWSTR ClassName, InstanceName, RemoteName, P; ULONG ClassNameLen, InstanceNameLen; DWORD CredentialsKind; PWSTR PipeBuf = 0; #if defined(FSP_NP_CREDENTIAL_MANAGER) PCREDENTIALW Credential = 0; #endif if (dwType & RESOURCETYPE_PRINT) return WN_BAD_VALUE; if (!FspNpParseRemoteName(lpRemoteName, &ClassName, &ClassNameLen, &InstanceName, &InstanceNameLen)) return WN_BAD_NETNAME; RemoteName = lpRemoteName + 1; LocalNameBuf[0] = L'\0'; if (0 != lpLocalName && L'\0' != lpLocalName[0]) { if (!FspNpCheckLocalName(lpLocalName)) return WN_BAD_LOCALNAME; LocalNameBuf[0] = lpLocalName[0] & ~0x20; /* convert to uppercase */ LocalNameBuf[1] = L':'; LocalNameBuf[2] = L'\0'; if (GetLogicalDrives() & (1 << (LocalNameBuf[0] - 'A'))) return WN_ALREADY_CONNECTED; } FspNpGetCredentialsKind(lpRemoteName, &CredentialsKind); #if defined(FSP_NP_CREDENTIAL_MANAGER) /* if we need credentials and none were passed check with the credential manager */ if (FSP_NP_CREDENTIALS_NONE != CredentialsKind && 0 == lpPassword && CredReadW(lpRemoteName, CRED_TYPE_GENERIC, 0, &Credential)) { if (sizeof(WCHAR) <= Credential->CredentialBlobSize && L'\0' == ((PWSTR)(Credential->CredentialBlob)) [(Credential->CredentialBlobSize / sizeof(WCHAR)) - 1]) { lpUserName = Credential->UserName; lpPassword = (PVOID)Credential->CredentialBlob; } } #endif /* if we need credentials and we don't have any return ACCESS DENIED */ if (FSP_NP_CREDENTIALS_NONE != CredentialsKind) { int Length; if (0 == lpPassword || (0 == (Length = lstrlenW(lpPassword))) || CREDUI_MAX_PASSWORD_LENGTH < Length) { NpResult = WN_ACCESS_DENIED; goto exit; } } if (FSP_NP_CREDENTIALS_USERPASS == CredentialsKind) { int Length; if (0 == lpUserName || (0 == (Length = lstrlenW(lpUserName))) || CREDUI_MAX_USERNAME_LENGTH < Length) { NpResult = WN_ACCESS_DENIED; goto exit; } } PipeBuf = MemAlloc(LAUNCHER_PIPE_BUFFER_SIZE); if (0 == PipeBuf) { NpResult = WN_OUT_OF_MEMORY; goto exit; } /* we do not explicitly check, but assumption is it all fits in LAUNCHER_PIPE_BUFFER_SIZE */ P = PipeBuf; *P++ = FSP_NP_CREDENTIALS_NONE != CredentialsKind ? LauncherSvcInstanceStartWithSecret : LauncherSvcInstanceStart; memcpy(P, ClassName, ClassNameLen * sizeof(WCHAR)); P += ClassNameLen; *P++ = L'\0'; memcpy(P, InstanceName, InstanceNameLen * sizeof(WCHAR)); P += InstanceNameLen; *P++ = L'\0'; lstrcpyW(P, RemoteName); P += lstrlenW(RemoteName) + 1; lstrcpyW(P, LocalNameBuf); P += lstrlenW(LocalNameBuf) + 1; if (FSP_NP_CREDENTIALS_USERPASS == CredentialsKind) { lstrcpyW(P, lpUserName); P += lstrlenW(lpUserName) + 1; } if (FSP_NP_CREDENTIALS_NONE != CredentialsKind) { lstrcpyW(P, lpPassword); P += lstrlenW(lpPassword) + 1; } NpResult = FspNpCallLauncherPipe( PipeBuf, (ULONG)(P - PipeBuf) * sizeof(WCHAR), LAUNCHER_PIPE_BUFFER_SIZE); switch (NpResult) { case WN_SUCCESS: case WN_ACCESS_DENIED: break; case ERROR_ALREADY_EXISTS: /* * The file system is already running! If we are being asked for a drive mapping, * see if it is the one we already have to decide on the error code to return. */ if (L'\0' != LocalNameBuf[0]) { WCHAR ExpectRemoteNameBuf[sizeof(((FSP_FSCTL_VOLUME_PARAMS *)0)->Prefix) / sizeof(WCHAR)]; WCHAR RemoteNameBuf[sizeof(((FSP_FSCTL_VOLUME_PARAMS *)0)->Prefix) / sizeof(WCHAR)]; DWORD RemoteNameSize; P = ExpectRemoteNameBuf; *P++ = L'\\'; *P++ = L'\\'; memcpy(P, ClassName, ClassNameLen * sizeof(WCHAR)); P += ClassNameLen; *P++ = L'\\'; memcpy(P, InstanceName, InstanceNameLen * sizeof(WCHAR)); P += InstanceNameLen; *P++ = L'\0'; RemoteNameSize = sizeof RemoteNameBuf / sizeof(WCHAR); NpResult = NPGetConnection(LocalNameBuf, RemoteNameBuf, &RemoteNameSize); if (WN_SUCCESS == NpResult) NpResult = 0 == lstrcmpW(ExpectRemoteNameBuf, RemoteNameBuf) ? WN_SUCCESS : WN_NO_NETWORK; else NpResult = WN_NO_NETWORK; } else /* we are not being asked for a drive mapping, so whatever we have is good! */ NpResult = WN_SUCCESS; break; default: NpResult = WN_NO_NETWORK; break; } exit: MemFree(PipeBuf); #if defined(FSP_NP_CREDENTIAL_MANAGER) if (0 != Credential) CredFree(Credential); #endif return NpResult; }