/*********************************************************************** * UPDOWN_SetBuddy * * Sets bud as a new Buddy. * Then, it should subclass the buddy * If window has the UDS_ARROWKEYS, it subclasses the buddy window to * process the UP/DOWN arrow keys. * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style * the size/pos of the buddy and the control are adjusted accordingly. */ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) { RECT budRect; /* new coord for the buddy */ int x, width; /* new x position and width for the up-down */ WCHAR buddyClass[40]; HWND ret; TRACE("(hwnd=%p, bud=%p)\n", infoPtr->Self, bud); ret = infoPtr->Buddy; /* there is already a buddy assigned */ if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID); if (!IsWindow(bud)) bud = NULL; /* Store buddy window handle */ infoPtr->Buddy = bud; if(bud) { /* Store buddy window class type */ infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN; if (GetClassNameW(bud, buddyClass, COUNT_OF(buddyClass))) { if (lstrcmpiW(buddyClass, WC_EDITW) == 0) infoPtr->BuddyType = BUDDY_TYPE_EDIT; else if (lstrcmpiW(buddyClass, WC_LISTBOXW) == 0) infoPtr->BuddyType = BUDDY_TYPE_LISTBOX; } if (infoPtr->dwStyle & UDS_ARROWKEYS) SetWindowSubclass(bud, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID, (DWORD_PTR)infoPtr->Self); /* Get the rect of the buddy relative to its parent */ GetWindowRect(infoPtr->Buddy, &budRect); MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Buddy), (POINT *)(&budRect.left), 2); /* now do the positioning */ if (infoPtr->dwStyle & UDS_ALIGNLEFT) { x = budRect.left; budRect.left += DEFAULT_WIDTH + DEFAULT_XSEP; } else if (infoPtr->dwStyle & UDS_ALIGNRIGHT) { budRect.right -= DEFAULT_WIDTH + DEFAULT_XSEP; x = budRect.right+DEFAULT_XSEP; } else { /* nothing to do */ return ret; } /* first adjust the buddy to accommodate the up/down */ SetWindowPos(infoPtr->Buddy, 0, budRect.left, budRect.top, budRect.right - budRect.left, budRect.bottom - budRect.top, SWP_NOACTIVATE|SWP_NOZORDER); /* now position the up/down */ /* Since the UDS_ALIGN* flags were used, */ /* we will pick the position and size of the window. */ width = DEFAULT_WIDTH; /* * If the updown has a buddy border, it has to overlap with the buddy * to look as if it is integrated with the buddy control. * We nudge the control or change its size to overlap. */ if (UPDOWN_HasBuddyBorder(infoPtr)) { if(infoPtr->dwStyle & UDS_ALIGNLEFT) width += DEFAULT_BUDDYBORDER; else x -= DEFAULT_BUDDYBORDER; } SetWindowPos(infoPtr->Self, 0, x, budRect.top - DEFAULT_ADDTOP, width, budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } else { RECT rect; GetWindowRect(infoPtr->Self, &rect); MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Self), (POINT *)&rect, 2); SetWindowPos(infoPtr->Self, 0, rect.left, rect.top, DEFAULT_WIDTH, rect.bottom - rect.top, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } return ret; }
static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOOL do_register) { LPCOLESTR iter; HRESULT hres; LONG lres; HKEY hkey = 0; strbuf name; enum { NORMAL, NO_REMOVE, IS_VAL, FORCE_REMOVE, DO_DELETE } key_type = NORMAL; static const WCHAR wstrNoRemove[] = {'N','o','R','e','m','o','v','e',0}; static const WCHAR wstrForceRemove[] = {'F','o','r','c','e','R','e','m','o','v','e',0}; static const WCHAR wstrDelete[] = {'D','e','l','e','t','e',0}; static const WCHAR wstrval[] = {'v','a','l',0}; iter = *pstr; hres = get_word(&iter, buf); if(FAILED(hres)) return hres; strbuf_init(&name); while(buf->str[1] || buf->str[0] != '}') { key_type = NORMAL; if(!lstrcmpiW(buf->str, wstrNoRemove)) key_type = NO_REMOVE; else if(!lstrcmpiW(buf->str, wstrForceRemove)) key_type = FORCE_REMOVE; else if(!lstrcmpiW(buf->str, wstrval)) key_type = IS_VAL; else if(!lstrcmpiW(buf->str, wstrDelete)) key_type = DO_DELETE; if(key_type != NORMAL) { hres = get_word(&iter, buf); if(FAILED(hres)) break; } TRACE("name = %s\n", debugstr_w(buf->str)); if(do_register) { if(key_type == IS_VAL) { hkey = parent_key; strbuf_write(buf->str, &name, -1); }else if(key_type == DO_DELETE) { TRACE("Deleting %s\n", debugstr_w(buf->str)); RegDeleteTreeW(parent_key, buf->str); }else { if(key_type == FORCE_REMOVE) RegDeleteTreeW(parent_key, buf->str); lres = RegCreateKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) { WARN("Could not create(open) key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } } }else if(key_type != IS_VAL && key_type != DO_DELETE) { strbuf_write(buf->str, &name, -1); lres = RegOpenKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) WARN("Could not open key %s: %08x\n", debugstr_w(name.str), lres); } if(key_type != DO_DELETE && *iter == '=') { iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; if(buf->len != 1) { WARN("Wrong registry type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; break; } if(do_register) { switch(buf->str[0]) { case 's': hres = get_word(&iter, buf); if(FAILED(hres)) break; lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_SZ, (PBYTE)buf->str, (lstrlenW(buf->str)+1)*sizeof(WCHAR)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; case 'd': { DWORD dw; hres = get_word(&iter, buf); if(FAILED(hres)) break; dw = atoiW(buf->str); lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_DWORD, (PBYTE)&dw, sizeof(dw)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; } case 'b': { BYTE *bytes; DWORD count; DWORD i; hres = get_word(&iter, buf); if(FAILED(hres)) break; count = (lstrlenW(buf->str) + 1) / 2; bytes = HeapAlloc(GetProcessHeap(), 0, count); if(bytes == NULL) { hres = E_OUTOFMEMORY; break; } for(i = 0; i < count && buf->str[2*i]; i++) { WCHAR digits[3]; if(!isxdigitW(buf->str[2*i]) || !isxdigitW(buf->str[2*i + 1])) { hres = E_FAIL; break; } digits[0] = buf->str[2*i]; digits[1] = buf->str[2*i + 1]; digits[2] = 0; bytes[i] = (BYTE) strtoulW(digits, NULL, 16); } if(SUCCEEDED(hres)) { lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_BINARY, bytes, count); if(lres != ERROR_SUCCESS) { WARN("Could not set value of key: 0x%08x\n", lres); hres = HRESULT_FROM_WIN32(lres); } } HeapFree(GetProcessHeap(), 0, bytes); break; } default: WARN("Wrong resource type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; }; if(FAILED(hres)) break; }else { if(*iter == '-') iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; } }else if(key_type == IS_VAL) { WARN("value not set!\n"); hres = DISP_E_EXCEPTION; break; } if(key_type != IS_VAL && key_type != DO_DELETE && *iter == '{' && isspaceW(iter[1])) { hres = get_word(&iter, buf); if(FAILED(hres)) break; hres = do_process_key(&iter, hkey, buf, do_register); if(FAILED(hres)) break; } TRACE("%x %x\n", do_register, key_type); if(!do_register && (key_type == NORMAL || key_type == FORCE_REMOVE)) { TRACE("Deleting %s\n", debugstr_w(name.str)); RegDeleteKeyW(parent_key, name.str); } if(hkey && key_type != IS_VAL) RegCloseKey(hkey); hkey = 0; name.len = 0; hres = get_word(&iter, buf); if(FAILED(hres)) break; } HeapFree(GetProcessHeap(), 0, name.str); if(hkey && key_type != IS_VAL) RegCloseKey(hkey); *pstr = iter; return hres; }
bool IsNeedCmd(BOOL bRootCmd, LPCWSTR asCmdLine, CEStr &szExe, LPCWSTR* rsArguments /*= NULL*/, BOOL* rpbNeedCutStartEndQuot /*= NULL*/, BOOL* rpbRootIsCmdExe /*= NULL*/, BOOL* rpbAlwaysConfirmExit /*= NULL*/, BOOL* rpbAutoDisableConfirmExit /*= NULL*/) { bool rbNeedCutStartEndQuot = false; bool rbRootIsCmdExe = true; bool rbAlwaysConfirmExit = false; bool rbAutoDisableConfirmExit = false; wchar_t *pwszEndSpace; if (rsArguments) *rsArguments = NULL; bool lbRc = false; BOOL lbFirstWasGot = FALSE; LPCWSTR pwszCopy; int nLastChar; #ifdef _DEBUG CmdArg szDbgFirst; #endif if (!asCmdLine || !*asCmdLine) { _ASSERTE(asCmdLine && *asCmdLine); goto wrap; } #ifdef _DEBUG // Это минимальные проверки, собственно к коду - не относятся bool bIsBatch = false; { NextArg(asCmdLine, szDbgFirst); LPCWSTR psz = PointToExt(szDbgFirst); if (lstrcmpi(psz, L".cmd")==0 || lstrcmpi(psz, L".bat")==0) bIsBatch = true; } #endif if (!szExe.GetBuffer(MAX_PATH)) { _ASSERTE(FALSE && "Failed to allocate MAX_PATH"); lbRc = true; goto wrap; } szExe.Empty(); if (!asCmdLine || *asCmdLine == 0) { _ASSERTE(asCmdLine && *asCmdLine); lbRc = true; goto wrap; } pwszCopy = asCmdLine; // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" nLastChar = lstrlenW(pwszCopy) - 1; if (pwszCopy[0] == L'"' && pwszCopy[nLastChar] == L'"') { //if (pwszCopy[1] == L'"' && pwszCopy[2]) //{ // pwszCopy ++; // Отбросить первую кавычку в командах типа: ""c:\program files\arc\7z.exe" -?" // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} //else // глючила на ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" //if (wcschr(pwszCopy+1, L'"') == (pwszCopy+nLastChar)) { // LPCWSTR pwszTemp = pwszCopy; // // Получим первую команду (исполняемый файл?) // if ((iRc = NextArg(&pwszTemp, szArg)) != 0) { // //Parsing command line failed // lbRc = true; goto wrap; // } // pwszCopy ++; // Отбросить первую кавычку в командах типа: "c:\arc\7z.exe -?" // lbFirstWasGot = TRUE; // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} else { // Will be dequoted in 'NextArg' function. Examples // "C:\GCC\msys\bin\make.EXE -f "makefile" COMMON="../../../plugins/common"" // ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" // ""cmd"" // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" // Получим первую команду (исполняемый файл?) CmdArg arg; if (!NextArg(pwszCopy, arg)) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } szExe.Set(arg); if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } LPCWSTR pwszQ = pwszCopy + 1 + lstrlen(szExe); wchar_t* pszExpand = NULL; if (*pwszQ != L'"' && IsExecutable(szExe, &pszExpand)) { pwszCopy ++; // отбрасываем lbFirstWasGot = TRUE; if (pszExpand) { szExe.Set(pszExpand); SafeFree(pszExpand); if (rsArguments) *rsArguments = pwszQ; } rbNeedCutStartEndQuot = true; } } } // Получим первую команду (исполняемый файл?) if (!lbFirstWasGot) { szExe.Empty(); // `start` command must be processed by processor itself if ((lstrcmpni(pwszCopy, L"start", 5) == 0) && (!pwszCopy[5] || isSpace(pwszCopy[5]))) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // 17.10.2010 - support executable file path without parameters, but with spaces in its path // 22.11.2015 - or some weirdness, like `C:\Program Files\CB/cb_console_runner.exe "C:\sources\app.exe"` LPCWSTR pchEnd = wcschr(pwszCopy, L' '); if (!pchEnd) pchEnd = pwszCopy + lstrlenW(pwszCopy); CEStr szTemp; DWORD nTempSize; while (pchEnd) { szTemp.Set(pwszCopy, (pchEnd - pwszCopy)); _ASSERTE(szTemp[(pchEnd - pwszCopy)] == 0); // Argument was quoted? if (!szTemp.IsEmpty()) { INT_PTR len = szTemp.GetLen(); if ((len > 2) && (szTemp[0] == L'"') && (szTemp[len-1] == L'"')) { memmove(szTemp.ms_Val, szTemp.ms_Val+1, (len-2)*sizeof(*szTemp.ms_Val)); szTemp.ms_Val[len-2] = 0; } } // If this is a full path without environment variables if (!szTemp.IsEmpty() && ((IsFilePath(szTemp, true) && !wcschr(szTemp, L'%')) // or file/dir may be found via env.var. substitution or searching in %PATH% || FileExistsSearch((LPCWSTR)szTemp, szTemp)) // Than check if it is a FILE (not a directory) && FileExists(szTemp, &nTempSize) && nTempSize) { // OK, it an our executable? if (rsArguments) *rsArguments = pchEnd; szExe.Set(szTemp); break; } _ASSERTE(*pchEnd == 0 || *pchEnd == L' '); if (!*pchEnd) break; // Find next space after nonspace while (*(pchEnd) == L' ') pchEnd++; // If quoted string starts from here - it's supposed to be an argument if (*pchEnd == L'"') { // And we must not get here, because the executable must be already processed above // _ASSERTE(*pchEnd != L'"'); break; } pchEnd = wcschr(pchEnd, L' '); if (!pchEnd) pchEnd = pwszCopy + lstrlenW(pwszCopy); } if (szExe.IsEmpty()) { CmdArg arg; if (!(pwszCopy = NextArg(pwszCopy, arg))) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } szExe.Set(arg); _ASSERTE(lstrcmpiW(szExe, L"start") != 0); // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pwszCopy; } } } if (!*szExe) { _ASSERTE(szExe[0] != 0); } else { // Если юзеру нужен редирект - то он должен явно указать ком.процессор // Иначе нереально (или достаточно сложно) определить, является ли символ // редиректом, или это просто один из аргументов команды... // "Левые" символы в имени файла (а вот в "первом аргументе" все однозначно) if (wcspbrk(szExe, L"?*<>|")) { rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } // если "путь" не указан if (wcschr(szExe, L'\\') == NULL) { bool bHasExt = (wcschr(szExe, L'.') != NULL); // Проверим, может это команда процессора (типа "DIR")? if (!bHasExt) { bool bIsCommand = false; wchar_t* pszUppr = lstrdup(szExe); if (pszUppr) { // избежать линковки на user32.dll //CharUpperBuff(pszUppr, lstrlen(pszUppr)); for (wchar_t* p = pszUppr; *p; p++) { if (*p >= L'a' && *p <= 'z') *p -= 0x20; } const wchar_t* pszFind = gsInternalCommands; while (*pszFind) { if (lstrcmp(pszUppr, pszFind) == 0) { bIsCommand = true; break; } pszFind += lstrlen(pszFind)+1; } free(pszUppr); } if (bIsCommand) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } } // Try to find executable in %PATH% { #ifndef CONEMU_MINIMAL MWow64Disable wow; wow.Disable(); // Disable Wow64 file redirector #endif apiSearchPath(NULL, szExe, bHasExt ? NULL : L".exe", szExe); } } // end: if (wcschr(szExe, L'\\') == NULL) } // Если szExe не содержит путь к файлу - запускаем через cmd // "start "" C:\Utils\Files\Hiew32\hiew32.exe C:\00\Far.exe" if (!IsFilePath(szExe)) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } //pwszCopy = wcsrchr(szArg, L'\\'); if (!pwszCopy) pwszCopy = szArg; else pwszCopy ++; pwszCopy = PointToName(szExe); //2009-08-27 pwszEndSpace = szExe.ms_Val + lstrlenW(szExe) - 1; while ((*pwszEndSpace == L' ') && (pwszEndSpace > szExe)) { *(pwszEndSpace--) = 0; } #ifndef __GNUC__ #pragma warning( push ) #pragma warning(disable : 6400) #endif if (lstrcmpiW(pwszCopy, L"cmd")==0 || lstrcmpiW(pwszCopy, L"cmd.exe")==0 || lstrcmpiW(pwszCopy, L"tcc")==0 || lstrcmpiW(pwszCopy, L"tcc.exe")==0) { rbRootIsCmdExe = TRUE; // уже должен быть выставлен, но проверим rbAlwaysConfirmExit = TRUE; rbAutoDisableConfirmExit = FALSE; _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан командный процессор, cmd.exe в начало добавлять не нужно } // Issue 1211: Decide not to do weird heuristic. // If user REALLY needs redirection (root command, huh?) // - he must call "cmd /c ..." directly // Если есть одна из команд перенаправления, или слияния - нужен CMD.EXE if (!bRootCmd) { if (wcschr(asCmdLine, L'&') || wcschr(asCmdLine, L'>') || wcschr(asCmdLine, L'<') || wcschr(asCmdLine, L'|') || wcschr(asCmdLine, L'^') // или экранирования ) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } } //if (lstrcmpiW(pwszCopy, L"far")==0 || lstrcmpiW(pwszCopy, L"far.exe")==0) if (IsFarExe(pwszCopy)) { bool bFound = (wcschr(pwszCopy, L'.') != NULL); // Если указали при запуске просто "far" - это может быть батник, расположенный в %PATH% if (!bFound) { CEStr szSearch; if (apiSearchPath(NULL, pwszCopy, L".exe", szSearch)) { if (lstrcmpi(PointToExt(szSearch), L".exe") == 0) bFound = true; } } if (bFound) { rbAutoDisableConfirmExit = TRUE; rbRootIsCmdExe = FALSE; // FAR! _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан исполняемый файл, cmd.exe в начало добавлять не нужно } } if (IsExecutable(szExe)) { rbRootIsCmdExe = FALSE; // Для других программ - буфер не включаем _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // Запускается конкретная консольная программа. cmd.exe не требуется } //Можно еще Доделать поиски с: SearchPath, GetFullPathName, добавив расширения .exe & .com //хотя фар сам формирует полные пути к командам, так что можно не заморачиваться #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; #ifndef __GNUC__ #pragma warning( pop ) #endif lbRc = true; wrap: if (rpbNeedCutStartEndQuot) *rpbNeedCutStartEndQuot = rbNeedCutStartEndQuot; if (rpbRootIsCmdExe) *rpbRootIsCmdExe = rbRootIsCmdExe; if (rpbAlwaysConfirmExit) *rpbAlwaysConfirmExit = rbAlwaysConfirmExit; if (rpbAutoDisableConfirmExit) *rpbAutoDisableConfirmExit = rbAutoDisableConfirmExit; return lbRc; }
/* loads the LDIDs specified in the install section of an INF */ void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir) { WCHAR field[MAX_FIELD_LENGTH]; WCHAR line[MAX_FIELD_LENGTH]; WCHAR dest[MAX_PATH]; INFCONTEXT context; DWORD size; int ldid; static const WCHAR source_dir[] = {'S','o','u','r','c','e','D','i','r',0}; static const WCHAR custDestW[] = { 'C','u','s','t','o','m','D','e','s','t','i','n','a','t','i','o','n',0 }; if (!SetupGetLineTextW(NULL, hInf, pszInstallSection, custDestW, field, MAX_FIELD_LENGTH, &size)) return; if (!SetupFindFirstLineW(hInf, field, NULL, &context)) return; do { LPWSTR value, ptr, key, key_copy = NULL; SetupGetLineTextW(&context, NULL, NULL, NULL, line, MAX_FIELD_LENGTH, &size); /* SetupGetLineTextW returns the value if there is only one key, but * returns the whole line if there is more than one key */ if (!(value = strchrW(line, '='))) { SetupGetStringFieldW(&context, 0, NULL, 0, &size); key = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); key_copy = key; SetupGetStringFieldW(&context, 0, key, size, &size); value = line; } else { key = line; *(value++) = '\0'; } /* remove leading whitespace from the value */ while (*value == ' ') value++; /* FIXME: need to check the query option */ ptr = strchrW(value, ','); if (ptr) *ptr = '\0'; /* set dest to pszWorkingDir if key is SourceDir */ if (pszWorkingDir && !lstrcmpiW(value, source_dir)) lstrcpynW(dest, pszWorkingDir, MAX_PATH); else get_dest_dir(hInf, value, dest, MAX_PATH); /* set all ldids to dest */ while ((ptr = get_parameter(&key, ','))) { ldid = atolW(ptr); SetupSetDirectoryIdW(hInf, ldid, dest); } HeapFree(GetProcessHeap(), 0, key_copy); } while (SetupFindNextLine(&context, &context)); }
static HRESULT WINAPI xmlelem_getAttribute(IXMLElement *iface, BSTR name, VARIANT *value) { static const WCHAR xmllangW[] = { 'x','m','l',':','l','a','n','g',0 }; xmlelem *This = impl_from_IXMLElement(iface); xmlChar *val = NULL; TRACE("(%p)->(%s, %p)\n", This, debugstr_w(name), value); if (!value) return E_INVALIDARG; VariantInit(value); V_BSTR(value) = NULL; if (!name) return E_INVALIDARG; /* case for xml:lang attribute */ if (!lstrcmpiW(name, xmllangW)) { xmlNsPtr ns; ns = xmlSearchNs(This->node->doc, This->node, (xmlChar*)"xml"); val = xmlGetNsProp(This->node, (xmlChar*)"lang", ns->href); } else { xmlAttrPtr attr; xmlChar *xml_name; xml_name = xmlchar_from_wchar(name); attr = This->node->properties; while (attr) { BSTR attr_name; attr_name = bstr_from_xmlChar(attr->name); if (!lstrcmpiW(name, attr_name)) { val = xmlNodeListGetString(attr->doc, attr->children, 1); SysFreeString(attr_name); break; } attr = attr->next; SysFreeString(attr_name); } heap_free(xml_name); } if (val) { V_VT(value) = VT_BSTR; V_BSTR(value) = bstr_from_xmlChar(val); } xmlFree(val); TRACE("returning %s\n", debugstr_w(V_BSTR(value))); return (val) ? S_OK : S_FALSE; }
__declspec(dllexport) bool TITCALL HandlerIsFileLockedW(wchar_t* szFileOrFolderName, bool NameIsFolder, bool NameIsTranslated) { HANDLE hProcess = NULL; HANDLE myHandle = NULL; HANDLE CopyHandle = NULL; ULONG RequiredSize = NULL; ULONG TotalHandleCount = NULL; DWORD LastProcessId = NULL; PNTDLL_QUERY_HANDLE_INFO HandleInfo; OBJECT_BASIC_INFORMATION ObjectBasicInfo; char ObjectNameInfo[0x2000] = {0}; POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo; char HandleFullNameB[0x1000] = {0}; LPVOID HandleFullName = HandleFullNameB; int LenFileOrFolderName = lstrlenW(szFileOrFolderName); LPVOID tmpHandleFullName = NULL; DynBuf hinfo; if(!NtQuerySysHandleInfo(hinfo)) return 0; LPVOID QuerySystemBuffer = hinfo.GetPtr(); RtlMoveMemory(&TotalHandleCount, QuerySystemBuffer, sizeof ULONG); QuerySystemBuffer = (LPVOID)((ULONG_PTR)QuerySystemBuffer + 4); HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)QuerySystemBuffer; while(TotalHandleCount > NULL) { if(LastProcessId != HandleInfo->ProcessId) { if(hProcess != NULL) { EngineCloseHandle(hProcess); } hProcess = EngineOpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE, false, HandleInfo->ProcessId); LastProcessId = HandleInfo->ProcessId; } if(hProcess != NULL) { //if(!(HandleInfo->GrantedAccess & SYNCHRONIZE) || ((HandleInfo->GrantedAccess & SYNCHRONIZE) && ((WORD)HandleInfo->GrantedAccess != 0x19F9))){// && (WORD)HandleInfo->GrantedAccess != 0x89))){ if(HandleInfo->GrantedAccess != 0x0012019F) { if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS)) { RtlZeroMemory(&ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION); NtQueryObject(myHandle, ObjectBasicInformation, &ObjectBasicInfo, sizeof OBJECT_BASIC_INFORMATION, &RequiredSize); NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize); NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize); RtlZeroMemory(HandleFullName, 0x1000); if(pObjectNameInfo->Name.Length != NULL) { //WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectNameInfo->Name.Buffer, -1, (LPSTR)HandleFullName, 0x1000, NULL, NULL); lstrcpyW((wchar_t*)HandleFullName, (wchar_t*)pObjectNameInfo->Name.Buffer); if(NameIsTranslated) { tmpHandleFullName = TranslateNativeNameW((wchar_t*)HandleFullName); if(tmpHandleFullName != NULL) { HandleFullName = tmpHandleFullName; } } if(NameIsFolder) { if(lstrlenW((LPCWSTR)HandleFullName) > LenFileOrFolderName) { RtlZeroMemory((LPVOID)((ULONG_PTR)HandleFullName + LenFileOrFolderName * 2), 2); } } if(lstrcmpiW((LPCWSTR)HandleFullName, szFileOrFolderName) == NULL) { EngineCloseHandle(myHandle); return true; } } EngineCloseHandle(myHandle); } } } HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)((ULONG_PTR)HandleInfo + sizeof NTDLL_QUERY_HANDLE_INFO); TotalHandleCount--; } return false; }
static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) { TRACE("(%d)\n", fdint); switch (fdint) { case fdintPARTIAL_FILE: { CabData *data = (CabData *)pfdin->pv; data->mi->is_continuous = FALSE; return 0; } case fdintNEXT_CABINET: { CabData *data = (CabData *)pfdin->pv; struct media_info *mi = data->mi; LPWSTR cab = strdupAtoW(pfdin->psz1); UINT rc; msi_free(mi->disk_prompt); msi_free(mi->cabinet); msi_free(mi->volume_label); mi->disk_prompt = NULL; mi->cabinet = NULL; mi->volume_label = NULL; mi->disk_id++; mi->is_continuous = TRUE; rc = msi_media_get_disk_info(data->package, mi); if (rc != ERROR_SUCCESS) { msi_free(cab); ERR("Failed to get next cabinet information: %d\n", rc); return -1; } if (lstrcmpiW(mi->cabinet, cab)) { msi_free(cab); ERR("Continuous cabinet does not match the next cabinet in the Media table\n"); return -1; } msi_free(cab); TRACE("Searching for %s\n", debugstr_w(mi->source)); if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES) rc = msi_change_media(data->package, mi); if (rc != ERROR_SUCCESS) return -1; return 0; } case fdintCOPY_FILE: { CabData *data = (CabData*) pfdin->pv; HANDLE handle; LPWSTR file; MSIFILE *f; DWORD attrs; file = strdupAtoW(pfdin->psz1); f = get_loaded_file(data->package, file); msi_free(file); if (!f) { WARN("unknown file in cabinet (%s)\n",debugstr_a(pfdin->psz1)); return 0; } if (f->state != msifs_missing && f->state != msifs_overwrite) { TRACE("Skipping extraction of %s\n",debugstr_a(pfdin->psz1)); return 0; } msi_file_update_ui( data->package, f, szInstallFiles ); TRACE("extracting %s\n", debugstr_w(f->TargetPath) ); attrs = f->Attributes & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); if (!attrs) attrs = FILE_ATTRIBUTE_NORMAL; handle = CreateFileW( f->TargetPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL ); if ( handle == INVALID_HANDLE_VALUE ) { if ( GetFileAttributesW( f->TargetPath ) != INVALID_FILE_ATTRIBUTES ) f->state = msifs_installed; else ERR("failed to create %s (error %d)\n", debugstr_w( f->TargetPath ), GetLastError() ); return 0; } f->state = msifs_installed; return (INT_PTR) handle; } case fdintCLOSE_FILE_INFO: { CabData *data = (CabData*) pfdin->pv; FILETIME ft; FILETIME ftLocal; HANDLE handle = (HANDLE) pfdin->hf; data->mi->is_continuous = FALSE; if (!DosDateTimeToFileTime(pfdin->date, pfdin->time, &ft)) return -1; if (!LocalFileTimeToFileTime(&ft, &ftLocal)) return -1; if (!SetFileTime(handle, &ftLocal, 0, &ftLocal)) return -1; CloseHandle(handle); return 1; } default: return 0; } }
/*********************************************************************** * MSSTYLES_ParseThemeIni * * Parse the theme ini for the selected color/style * * PARAMS * tf Theme to parse */ void MSSTYLES_ParseThemeIni(PTHEME_FILE tf) { static const WCHAR szSysMetrics[] = {'S','y','s','M','e','t','r','i','c','s','\0'}; static const WCHAR szGlobals[] = {'g','l','o','b','a','l','s','\0'}; PTHEME_CLASS cls; PTHEME_CLASS globals; PTHEME_PARTSTATE ps; PUXINI_FILE ini; WCHAR szAppName[MAX_THEME_APP_NAME]; WCHAR szClassName[MAX_THEME_CLASS_NAME]; WCHAR szPropertyName[MAX_THEME_VALUE_NAME]; int iPartId; int iStateId; int iPropertyPrimitive; int iPropertyId; DWORD dwLen; LPCWSTR lpName; DWORD dwValueLen; LPCWSTR lpValue; if(tf->classes) return; ini = MSSTYLES_GetActiveThemeIni(tf); while((lpName=UXINI_GetNextSection(ini, &dwLen))) { if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpName, dwLen, szSysMetrics, -1) == CSTR_EQUAL) { while((lpName=UXINI_GetNextValue(ini, &dwLen, &lpValue, &dwValueLen))) { lstrcpynW(szPropertyName, lpName, min(dwLen+1, sizeof(szPropertyName)/sizeof(szPropertyName[0]))); if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive, &iPropertyId)) { /* Catch all metrics, including colors */ MSSTYLES_AddMetric(tf, iPropertyPrimitive, iPropertyId, lpValue, dwValueLen); } else { TRACE("Unknown system metric %s\n", debugstr_w(szPropertyName)); } } continue; } if(MSSTYLES_ParseIniSectionName(lpName, dwLen, szAppName, szClassName, &iPartId, &iStateId)) { BOOL isGlobal = FALSE; if(!lstrcmpiW(szClassName, szGlobals)) { isGlobal = TRUE; } cls = MSSTYLES_AddClass(tf, szAppName, szClassName); ps = MSSTYLES_AddPartState(cls, iPartId, iStateId); while((lpName=UXINI_GetNextValue(ini, &dwLen, &lpValue, &dwValueLen))) { lstrcpynW(szPropertyName, lpName, min(dwLen+1, sizeof(szPropertyName)/sizeof(szPropertyName[0]))); if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive, &iPropertyId)) { MSSTYLES_AddProperty(ps, iPropertyPrimitive, iPropertyId, lpValue, dwValueLen, isGlobal); } else { TRACE("Unknown property %s\n", debugstr_w(szPropertyName)); } } } } /* App/Class combos override values defined by the base class, map these overrides */ globals = MSSTYLES_FindClass(tf, NULL, szGlobals); cls = tf->classes; while(cls) { if(*cls->szAppName) { cls->overrides = MSSTYLES_FindClass(tf, NULL, cls->szClassName); if(!cls->overrides) { TRACE("No overrides found for app %s class %s\n", debugstr_w(cls->szAppName), debugstr_w(cls->szClassName)); } else { cls->overrides = globals; } } else { /* Everything overrides globals..except globals */ if(cls != globals) cls->overrides = globals; } cls = cls->next; } UXINI_CloseINI(ini); if(!tf->classes) { ERR("Failed to parse theme ini\n"); } }
/****************************************************************************** * FileMoniker_RelativePathTo */ static HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath) { IBindCtx *bind; HRESULT res; LPOLESTR str1=0,str2=0,*tabStr1=0,*tabStr2=0,relPath=0; DWORD len1=0,len2=0,sameIdx=0,j=0; static const WCHAR back[] ={'.','.','\\',0}; TRACE("(%p,%p,%p)\n",iface,pmOther,ppmkRelPath); if (ppmkRelPath==NULL) return E_POINTER; if (pmOther==NULL) return E_INVALIDARG; res=CreateBindCtx(0,&bind); if (FAILED(res)) return res; res=IMoniker_GetDisplayName(iface,bind,NULL,&str1); if (FAILED(res)) return res; res=IMoniker_GetDisplayName(pmOther,bind,NULL,&str2); if (FAILED(res)) return res; len1=FileMonikerImpl_DecomposePath(str1,&tabStr1); if (FAILED(len1)) return E_OUTOFMEMORY; len2=FileMonikerImpl_DecomposePath(str2,&tabStr2); if (FAILED(len2)) { free_stringtable(tabStr1); return E_OUTOFMEMORY; } /* count the number of similar items from the begin of the two paths */ for(sameIdx=0; ( (tabStr1[sameIdx]!=NULL) && (tabStr2[sameIdx]!=NULL) && (lstrcmpiW(tabStr1[sameIdx],tabStr2[sameIdx])==0)); sameIdx++); /* begin the construction of relativePath */ /* if the two paths have a consecutive similar item from the begin ! the relativePath will be composed */ /* by "..\\" in the begin */ relPath=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(1+lstrlenW(str1)+lstrlenW(str2))); *relPath=0; if (len2>0 && !(len1==1 && len2==1 && sameIdx==0)) for(j=sameIdx;(tabStr1[j] != NULL); j++) if (*tabStr1[j]!='\\') strcatW(relPath,back); /* add items of the second path (similar items with the first path are not included) to the relativePath */ for(j=sameIdx;tabStr2[j]!=NULL;j++) strcatW(relPath,tabStr2[j]); res=CreateFileMoniker(relPath,ppmkRelPath); free_stringtable(tabStr1); free_stringtable(tabStr2); CoTaskMemFree(str1); CoTaskMemFree(str2); HeapFree(GetProcessHeap(),0,relPath); if (len1==0 || len2==0 || (len1==1 && len2==1 && sameIdx==0)) return MK_S_HIM; return res; }
bool CheckCanCreateWindow(LPCSTR lpClassNameA, LPCWSTR lpClassNameW, DWORD& dwStyle, DWORD& dwExStyle, HWND& hWndParent, BOOL& bAttachGui, BOOL& bStyleHidden) { bAttachGui = FALSE; #ifdef _DEBUG // "!dwStyle" добавил для shell32.dll!CExecuteApplication::_CreateHiddenDDEWindow() _ASSERTE(hWndParent==NULL || ghConEmuWnd == NULL || hWndParent!=ghConEmuWnd || !dwStyle); STARTUPINFO si = {sizeof(si)}; GetStartupInfo(&si); bool lbAfxFrameOrView90 = false; if (lpClassNameA && (((DWORD_PTR)lpClassNameA) & ~0xFFFF)) { lbAfxFrameOrView90 = lstrcmpA(lpClassNameA, "AfxFrameOrView90") == 0 || lstrcmpiA(lpClassNameA, "Xshell4:MainWnd") == 0; } else if (lpClassNameW && (((DWORD_PTR)lpClassNameW) & ~0xFFFF)) { lbAfxFrameOrView90 = lstrcmpW(lpClassNameW, L"AfxFrameOrView90") == 0 || lstrcmpiW(lpClassNameW, L"Xshell4:MainWnd") == 0; } if (lbAfxFrameOrView90) { lbAfxFrameOrView90 = true; } #endif if (gbAttachGuiClient && ghConEmuWndBack) { #ifdef _DEBUG WNDCLASS wc = {}; BOOL lbClass = FALSE; if ((lpClassNameW && ((DWORD_PTR)lpClassNameW) <= 0xFFFF)) { lbClass = GetClassInfo((HINSTANCE)GetModuleHandle(NULL), lpClassNameW, &wc); } #endif DWORD nTID = GetCurrentThreadId(); if ((nTID != gnHookMainThreadId) && (gnAttachGuiClientThreadId && nTID != gnAttachGuiClientThreadId)) { _ASSERTEX(nTID==gnHookMainThreadId || !gnAttachGuiClientThreadId || (ghAttachGuiClient && IsWindow(ghAttachGuiClient))); } else { const DWORD dwNormalSized = (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX); // Some applications can 'disable' Maximize button but they are still 'resizeable' const DWORD dwDlgSized = (WS_POPUP|WS_THICKFRAME); const DWORD dwSizedMask = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_POPUP|DS_MODALFRAME|WS_CHILDWINDOW); const DWORD dwNoCaptionSized = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX); // Lets check bool lbCanAttach = // Обычное окно с заголовком (0x00CF0000 or 0x00CE0000) ((dwStyle & dwNormalSized) == dwNormalSized) // Диалог с ресайзом рамки (0x80040000) || ((dwStyle & dwDlgSized) == dwDlgSized) // Обычное окно без заголовка (0xC0070080 : 0x00070000) || ((dwStyle & dwSizedMask) == dwNoCaptionSized) ; if (dwStyle & (DS_MODALFRAME|WS_CHILDWINDOW)) lbCanAttach = false; else if ((dwStyle & WS_POPUP) && !(dwStyle & WS_THICKFRAME)) lbCanAttach = false; else if (dwExStyle & (WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_DLGMODALFRAME|WS_EX_MDICHILD)) lbCanAttach = false; // Disable attach of some window classes if (lbCanAttach && lpClassNameW && (((DWORD_PTR)lpClassNameW) & ~0xFFFF)) { if (lstrcmpW(lpClassNameW, L"MozillaTempWindowClass") == 0) lbCanAttach = false; } if (lbCanAttach) { // Родительское окно - ConEmu DC // -- hWndParent = ghConEmuWndBack; // Надо ли его ставить сразу, если не включаем WS_CHILD? // WS_CHILDWINDOW перед созданием выставлять нельзя, т.к. например у WordPad.exe сносит крышу: // все его окна создаются нормально, но он показывает ошибку "Не удалось создать новый документ" //// Уберем рамку, меню и заголовок - оставим //dwStyle = (dwStyle | WS_CHILDWINDOW|WS_TABSTOP) & ~(WS_THICKFRAME/*|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX*/); bStyleHidden = (dwStyle & WS_VISIBLE) == WS_VISIBLE; dwStyle &= ~WS_VISIBLE; // А вот видимость - точно сбросим ////dwExStyle = dwExStyle & ~WS_EX_WINDOWEDGE; bAttachGui = TRUE; //gbAttachGuiClient = FALSE; // Только одно окно приложения -- сбросим после реального создания окна gbGuiClientAttached = TRUE; // Сразу взведем флажок режима #ifdef _DEBUG if (!ghGuiClientRetHook) ghGuiClientRetHook = SetWindowsHookExW(WH_CALLWNDPROCRET, GuiClientRetHook, NULL, GetCurrentThreadId()); //if (!ghGuiClientCallHook) // ghGuiClientCallHook = SetWindowsHookExW(WH_CALLWNDPROC, GuiClientCallHook, NULL, GetCurrentThreadId()); //if (!ghGuiClientMsgHook) // ghGuiClientMsgHook = SetWindowsHookExW(WH_GETMESSAGE, GuiClientMsgHook, NULL, GetCurrentThreadId()); #endif //gnAttachGuiClientThreadId = nTID; -- перенес к "ghAttachGuiClient = hWindow;" RECT rcGui = AttachGuiClientPos(dwStyle, dwExStyle); if (hWndParent != ghConEmuWndBack) { MapWindowPoints(ghConEmuWndBack, hWndParent, (LPPOINT)&rcGui, 2); } grcConEmuClient = rcGui; } return true; } } if (gbGuiClientAttached /*ghAttachGuiClient*/) { return true; // В GUI приложениях - разрешено все } #ifndef _DEBUG return true; #else if (gnHookMainThreadId && gnHookMainThreadId != GetCurrentThreadId()) return true; // Разрешено, отдается на откуп консольной программе/плагинам if ((dwStyle & (WS_POPUP|DS_MODALFRAME)) == (WS_POPUP|DS_MODALFRAME)) { // Это скорее всего обычный диалог, разрешим, но пока для отладчика - assert _ASSERTE((dwStyle & WS_POPUP) == 0); return true; } if ((lpClassNameA && ((DWORD_PTR)lpClassNameA) <= 0xFFFF) || (lpClassNameW && ((DWORD_PTR)lpClassNameW) <= 0xFFFF)) { // Что-то системное return true; } // Окно на любой чих создается. dwStyle == 0x88000000. if ((lpClassNameW && lstrcmpW(lpClassNameW, L"CicMarshalWndClass") == 0) || (lpClassNameA && lstrcmpA(lpClassNameA, "CicMarshalWndClass") == 0) ) { return true; } // WiX if ((lpClassNameW && lstrcmpW(lpClassNameW, L"MsiHiddenWindow") == 0) ) { return true; } #ifdef _DEBUG // В консоли нет обработчика сообщений, поэтому создание окон в главной // нити приводит к "зависанию" приложения - например, любые программы, // использующие DDE могут виснуть. wchar_t szModule[MAX_PATH] = {}; GetModuleFileName(ghOurModule, szModule, countof(szModule)); //const wchar_t* pszSlash = PointToName(szModule); //if (lstrcmpi(pszSlash, L"far.exe")==0 || lstrcmpi(szModule, L"far64.exe")==0) if (IsFarExe(szModule)) { _ASSERTE(dwStyle == 0 && FALSE); } //SetLastError(ERROR_THREAD_MODE_NOT_BACKGROUND); //return false; #endif // Разрешить? По настройке? return true; #endif }
/********************************************************************** * MSSTYLES_OpenThemeFile * * Load and validate a theme * * PARAMS * lpThemeFile Path to theme file to load * pszColorName Color name wanted, can be NULL * pszSizeName Size name wanted, can be NULL * * NOTES * If pszColorName or pszSizeName are NULL, the default color/size will be used. * If one/both are provided, they are validated against valid color/sizes and if * a match is not found, the function fails. */ HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR pszSizeName, PTHEME_FILE *tf) { HMODULE hTheme; HRSRC hrsc; HRESULT hr = S_OK; static const WCHAR szPackThemVersionResource[] = { 'P','A','C','K','T','H','E','M','_','V','E','R','S','I','O','N', '\0' }; static const WCHAR szColorNamesResource[] = { 'C','O','L','O','R','N','A','M','E','S','\0' }; static const WCHAR szSizeNamesResource[] = { 'S','I','Z','E','N','A','M','E','S','\0' }; WORD version; DWORD versize; LPWSTR pszColors; LPWSTR pszSelectedColor = NULL; LPWSTR pszSizes; LPWSTR pszSelectedSize = NULL; LPWSTR tmp; if (!gbThemeHooksActive) return E_FAIL; TRACE("Opening %s\n", debugstr_w(lpThemeFile)); hTheme = LoadLibraryExW(lpThemeFile, NULL, LOAD_LIBRARY_AS_DATAFILE); /* Validate that this is really a theme */ if(!hTheme) { hr = HRESULT_FROM_WIN32(GetLastError()); goto invalid_theme; } if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szPackThemVersionResource))) { TRACE("No version resource found\n"); hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); goto invalid_theme; } if((versize = SizeofResource(hTheme, hrsc)) != 2) { TRACE("Version resource found, but wrong size: %d\n", versize); hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); goto invalid_theme; } version = *(WORD*)LoadResource(hTheme, hrsc); if(version != MSSTYLES_VERSION) { TRACE("Version of theme file is unsupported: 0x%04x\n", version); hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); goto invalid_theme; } if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szColorNamesResource))) { TRACE("Color names resource not found\n"); hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); goto invalid_theme; } pszColors = LoadResource(hTheme, hrsc); if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szSizeNamesResource))) { TRACE("Size names resource not found\n"); hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); goto invalid_theme; } pszSizes = LoadResource(hTheme, hrsc); /* Validate requested color against what's available from the theme */ if(pszColorName) { tmp = pszColors; while(*tmp) { if(!lstrcmpiW(pszColorName, tmp)) { pszSelectedColor = tmp; break; } tmp += lstrlenW(tmp)+1; } } else pszSelectedColor = pszColors; /* Use the default color */ /* Validate requested size against what's available from the theme */ if(pszSizeName) { tmp = pszSizes; while(*tmp) { if(!lstrcmpiW(pszSizeName, tmp)) { pszSelectedSize = tmp; break; } tmp += lstrlenW(tmp)+1; } } else pszSelectedSize = pszSizes; /* Use the default size */ if(!pszSelectedColor || !pszSelectedSize) { TRACE("Requested color/size (%s/%s) not found in theme\n", debugstr_w(pszColorName), debugstr_w(pszSizeName)); hr = E_PROP_ID_UNSUPPORTED; goto invalid_theme; } *tf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THEME_FILE)); (*tf)->hTheme = hTheme; GetFullPathNameW(lpThemeFile, MAX_PATH, (*tf)->szThemeFile, NULL); (*tf)->pszAvailColors = pszColors; (*tf)->pszAvailSizes = pszSizes; (*tf)->pszSelectedColor = pszSelectedColor; (*tf)->pszSelectedSize = pszSelectedSize; (*tf)->dwRefCount = 1; TRACE("Theme %p refcount: %d\n", *tf, (*tf)->dwRefCount); return S_OK; invalid_theme: if(hTheme) FreeLibrary(hTheme); return hr; }
/************************************************************************** * StringTableAddString [SETUPAPI.@] * * Adds a new string to the string table. * * PARAMS * hStringTable [I] Handle to the string table * lpString [I] String to be added to the string table * dwFlags [I] Flags * 1: case sensitive compare * * RETURNS * Success: String ID * Failure: -1 * * NOTES * If the given string already exists in the string table it will not * be added again. The ID of the existing string will be returned in * this case. */ DWORD WINAPI StringTableAddString(HSTRING_TABLE hStringTable, LPWSTR lpString, DWORD dwFlags) { PSTRING_TABLE pStringTable; DWORD i; TRACE("%p %s %lx\n", hStringTable, debugstr_w(lpString), dwFlags); pStringTable = (PSTRING_TABLE)hStringTable; if (pStringTable == NULL) { ERR("Invalid hStringTable!\n"); return (DWORD)-1; } /* Search for existing string in the string table */ for (i = 0; i < pStringTable->dwMaxSlots; i++) { if (pStringTable->pSlots[i].pString != NULL) { if (dwFlags & 1) { if (!lstrcmpW(pStringTable->pSlots[i].pString, lpString)) { return i + 1; } } else { if (!lstrcmpiW(pStringTable->pSlots[i].pString, lpString)) { return i + 1; } } } } /* Check for filled slot table */ if (pStringTable->dwUsedSlots == pStringTable->dwMaxSlots) { FIXME("Resize the string table!\n"); return (DWORD)-1; } /* Search for an empty slot */ for (i = 0; i < pStringTable->dwMaxSlots; i++) { if (pStringTable->pSlots[i].pString == NULL) { pStringTable->pSlots[i].pString = MyMalloc((lstrlenW(lpString) + 1) * sizeof(WCHAR)); if (pStringTable->pSlots[i].pString == NULL) { TRACE("Couldn't allocate memory for a new string!\n"); return (DWORD)-1; } lstrcpyW(pStringTable->pSlots[i].pString, lpString); pStringTable->dwUsedSlots++; return i + 1; } } TRACE("Couldn't find an empty slot!\n"); return (DWORD)-1; }
/****************************************************************** * WDML_ClientProc * * Window Proc created on client side for each conversation */ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { UINT uiLo, uiHi; WDML_CONV* pConv = NULL; HSZ hszSrv, hszTpc; TRACE("%p %04x %08lx %08lx\n", hwnd, iMsg, wParam , lParam); if (iMsg == WM_DDE_ACK && /* in the initial WM_INITIATE sendmessage */ ((pConv = WDML_GetConvFromWnd(hwnd)) == NULL || pConv->wStatus == XST_INIT1)) { /* In response to WM_DDE_INITIATE, save server window */ char buf[256]; WDML_INSTANCE* pInstance; /* note: sent messages do not need packing */ uiLo = LOWORD(lParam); uiHi = HIWORD(lParam); /* FIXME: convlist should be handled here */ if (pConv) { /* we already have started the conv with a server, drop other replies */ GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); PostMessageW((HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hwnd, 0); return 0; } pInstance = WDML_GetInstanceFromWnd(hwnd); hszSrv = WDML_MakeHszFromAtom(pInstance, uiLo); hszTpc = WDML_MakeHszFromAtom(pInstance, uiHi); pConv = WDML_AddConv(pInstance, WDML_CLIENT_SIDE, hszSrv, hszTpc, hwnd, (HWND)wParam); SetWindowLongPtrW(hwnd, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); pConv->wStatus |= ST_CONNECTED; pConv->wConvst = XST_INIT1; /* check if server is handled by DDEML */ if ((GetClassNameA((HWND)wParam, buf, sizeof(buf)) && lstrcmpiA(buf, WDML_szServerConvClassA) == 0) || (GetClassNameW((HWND)wParam, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) && lstrcmpiW((LPWSTR)buf, WDML_szServerConvClassW) == 0)) { pConv->wStatus |= ST_ISLOCAL; } WDML_BroadcastDDEWindows(WDML_szEventClass, WM_WDML_CONNECT_CONFIRM, (WPARAM)hwnd, wParam); GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); /* accept conversation */ return 1; } if (iMsg >= WM_DDE_FIRST && iMsg <= WM_DDE_LAST) { pConv = WDML_GetConvFromWnd(hwnd); if (pConv) { MSG msg; HDDEDATA hdd; msg.hwnd = hwnd; msg.message = iMsg; msg.wParam = wParam; msg.lParam = lParam; WDML_HandleReply(pConv, &msg, &hdd, NULL); } return 0; } return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, iMsg, wParam, lParam) : DefWindowProcA(hwnd, iMsg, wParam, lParam); }
/****************************************************************************** * FileMoniker_CommonPrefixWith */ static HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix) { LPOLESTR pathThis,pathOther,*stringTable1,*stringTable2,commonPath; IBindCtx *pbind; DWORD mkSys; ULONG nb1,nb2,i,sameIdx; BOOL machimeNameCase=FALSE; if (ppmkPrefix==NULL) return E_POINTER; if (pmkOther==NULL) return E_INVALIDARG; *ppmkPrefix=0; /* check if we have the same type of moniker */ IMoniker_IsSystemMoniker(pmkOther,&mkSys); if(mkSys==MKSYS_FILEMONIKER){ HRESULT ret; CreateBindCtx(0,&pbind); /* create a string based on common part of the two paths */ IMoniker_GetDisplayName(iface,pbind,NULL,&pathThis); IMoniker_GetDisplayName(pmkOther,pbind,NULL,&pathOther); nb1=FileMonikerImpl_DecomposePath(pathThis,&stringTable1); nb2=FileMonikerImpl_DecomposePath(pathOther,&stringTable2); if (nb1==0 || nb2==0) return MK_E_NOPREFIX; commonPath=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(min(lstrlenW(pathThis),lstrlenW(pathOther))+1)); *commonPath=0; for(sameIdx=0; ( (stringTable1[sameIdx]!=NULL) && (stringTable2[sameIdx]!=NULL) && (lstrcmpiW(stringTable1[sameIdx],stringTable2[sameIdx])==0)); sameIdx++); if (sameIdx > 1 && *stringTable1[0]=='\\' && *stringTable2[1]=='\\'){ machimeNameCase=TRUE; for(i=2;i<sameIdx;i++) if( (*stringTable1[i]=='\\') && (i+1 < sameIdx) && (*stringTable1[i+1]=='\\') ){ machimeNameCase=FALSE; break; } } if (machimeNameCase && *stringTable1[sameIdx-1]=='\\') sameIdx--; if (machimeNameCase && (sameIdx<=3) && (nb1 > 3 || nb2 > 3) ) ret = MK_E_NOPREFIX; else { for(i=0;i<sameIdx;i++) strcatW(commonPath,stringTable1[i]); for(i=0;i<nb1;i++) CoTaskMemFree(stringTable1[i]); CoTaskMemFree(stringTable1); for(i=0;i<nb2;i++) CoTaskMemFree(stringTable2[i]); CoTaskMemFree(stringTable2); ret = CreateFileMoniker(commonPath,ppmkPrefix); } HeapFree(GetProcessHeap(),0,commonPath); return ret; } else return MonikerCommonPrefixWith(iface,pmkOther,ppmkPrefix); }
bool COpenGL::SetShadersGLSL_OLD(const TCHAR *glslFileName) { char *fragment = NULL, *vertex = NULL; IXMLDOMDocument * pXMLDoc = NULL; IXMLDOMElement * pXDE = NULL; IXMLDOMNode * pXDN = NULL; HRESULT hr; BSTR queryString, nodeContent; TCHAR errorMsg[MAX_PATH + 50]; if (fragmentShader) { glDetachShader(shaderProgram, fragmentShader); glDeleteShader(fragmentShader); fragmentShader = 0; } if (vertexShader) { glDetachShader(shaderProgram, vertexShader); glDeleteShader(vertexShader); vertexShader = 0; } if (shaderProgram) { glUseProgram(0); glDeleteProgram(shaderProgram); shaderProgram = 0; } if (glslFileName == NULL || *glslFileName == TEXT('\0')) return true; if (!LoadShaderFunctions()) { MessageBox(NULL, TEXT("Unable to load OpenGL shader functions"), TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); return false; } hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pXMLDoc)); if (FAILED(hr)) { MessageBox(NULL, TEXT("Error creating XML Parser"), TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); return false; } VARIANT fileName; VARIANT_BOOL ret; fileName.vt = VT_BSTR; #ifdef UNICODE fileName.bstrVal = SysAllocString(glslFileName); #else wchar_t tempfilename[MAX_PATH]; MultiByteToWideChar(CP_UTF8, 0, glslFileName, -1, tempfilename, MAX_PATH); fileName.bstrVal = SysAllocString(tempfilename); #endif hr = pXMLDoc->load(fileName, &ret); SysFreeString(fileName.bstrVal); if (FAILED(hr) || hr == S_FALSE) { _stprintf(errorMsg, TEXT("Error loading GLSL shader file:\n%s"), glslFileName); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); pXMLDoc->Release(); return false; } VARIANT attributeValue; BSTR attributeName; hr = pXMLDoc->get_documentElement(&pXDE); if (FAILED(hr) || hr == S_FALSE) { _stprintf(errorMsg, TEXT("Error loading root element from file:\n%s"), glslFileName); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); pXMLDoc->Release(); return false; } attributeName = SysAllocString(L"language"); pXDE->getAttribute(attributeName, &attributeValue); SysFreeString(attributeName); pXDE->Release(); if (attributeValue.vt != VT_BSTR || lstrcmpiW(attributeValue.bstrVal, L"glsl")) { _stprintf(errorMsg, TEXT("Shader language is <%s>, expected <GLSL> in file:\n%s"), attributeValue.bstrVal, glslFileName); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); if (attributeValue.vt == VT_BSTR) SysFreeString(attributeValue.bstrVal); pXMLDoc->Release(); return false; } if (attributeValue.vt == VT_BSTR) SysFreeString(attributeValue.bstrVal); queryString = SysAllocString(L"/shader/fragment"); hr = pXMLDoc->selectSingleNode(queryString, &pXDN); SysFreeString(queryString); if (hr == S_OK) { hr = pXDN->get_text(&nodeContent); if (hr == S_OK) { int requiredChars = WideCharToMultiByte(CP_ACP, 0, nodeContent, -1, fragment, 0, NULL, NULL); fragment = new char[requiredChars]; WideCharToMultiByte(CP_UTF8, 0, nodeContent, -1, fragment, requiredChars, NULL, NULL); } SysFreeString(nodeContent); pXDN->Release(); pXDN = NULL; } queryString = SysAllocString(L"/shader/vertex"); hr = pXMLDoc->selectSingleNode(queryString, &pXDN); SysFreeString(queryString); if (hr == S_OK) { hr = pXDN->get_text(&nodeContent); if (hr == S_OK) { int requiredChars = WideCharToMultiByte(CP_ACP, 0, nodeContent, -1, vertex, 0, NULL, NULL); vertex = new char[requiredChars]; WideCharToMultiByte(CP_UTF8, 0, nodeContent, -1, vertex, requiredChars, NULL, NULL); } SysFreeString(nodeContent); pXDN->Release(); pXDN = NULL; } pXMLDoc->Release(); if (!fragment && !vertex) { _stprintf(errorMsg, TEXT("No vertex or fragment program in file:\n%s"), glslFileName); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK | MB_ICONEXCLAMATION); return false; } shaderProgram = glCreateProgram(); if (vertex) { vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, (const GLchar **)&vertex, NULL); glCompileShader(vertexShader); glAttachShader(shaderProgram, vertexShader); delete[] vertex; } if (fragment) { fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, (const GLchar **)&fragment, NULL); glCompileShader(fragmentShader); glAttachShader(shaderProgram, fragmentShader); delete[] fragment; } glLinkProgram(shaderProgram); glUseProgram(shaderProgram); shader_type = OGL_SHADER_GLSL_OLD; return true; }
/****************************************************************************** * FileMoniker_CommonPrefixWith */ static HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix) { LPOLESTR pathThis = NULL, pathOther = NULL,*stringTable1,*stringTable2,commonPath = NULL; IBindCtx *bindctx; DWORD mkSys; ULONG nb1,nb2,i,sameIdx; BOOL machineNameCase = FALSE; HRESULT ret; if (ppmkPrefix==NULL) return E_POINTER; if (pmkOther==NULL) return E_INVALIDARG; *ppmkPrefix=0; /* check if we have the same type of moniker */ IMoniker_IsSystemMoniker(pmkOther,&mkSys); if (mkSys != MKSYS_FILEMONIKER) return MonikerCommonPrefixWith(iface, pmkOther, ppmkPrefix); ret = CreateBindCtx(0, &bindctx); if (FAILED(ret)) return ret; /* create a string based on common part of the two paths */ ret = IMoniker_GetDisplayName(iface, bindctx, NULL, &pathThis); if (FAILED(ret)) goto failed; ret = IMoniker_GetDisplayName(pmkOther, bindctx, NULL, &pathOther); if (FAILED(ret)) goto failed; nb1 = FileMonikerImpl_DecomposePath(pathThis, &stringTable1); if (FAILED(nb1)) { ret = nb1; goto failed; } nb2 = FileMonikerImpl_DecomposePath(pathOther, &stringTable2); if (FAILED(nb2)) { ret = nb2; goto failed; } if (nb1 == 0 || nb2 == 0) { ret = MK_E_NOPREFIX; goto failed; } commonPath = CoTaskMemAlloc(sizeof(WCHAR)*(min(lstrlenW(pathThis),lstrlenW(pathOther))+1)); if (!commonPath) { ret = E_OUTOFMEMORY; goto failed; } *commonPath = 0; for(sameIdx=0; ( (stringTable1[sameIdx]!=NULL) && (stringTable2[sameIdx]!=NULL) && (lstrcmpiW(stringTable1[sameIdx],stringTable2[sameIdx])==0)); sameIdx++); if (sameIdx > 1 && *stringTable1[0]=='\\' && *stringTable2[1]=='\\'){ machineNameCase = TRUE; for(i=2;i<sameIdx;i++) if( (*stringTable1[i]=='\\') && (i+1 < sameIdx) && (*stringTable1[i+1]=='\\') ){ machineNameCase = FALSE; break; } } if (machineNameCase && *stringTable1[sameIdx-1]=='\\') sameIdx--; if (machineNameCase && (sameIdx<=3) && (nb1 > 3 || nb2 > 3) ) ret = MK_E_NOPREFIX; else { for (i = 0; i < sameIdx; i++) strcatW(commonPath,stringTable1[i]); ret = CreateFileMoniker(commonPath, ppmkPrefix); } failed: IBindCtx_Release(bindctx); CoTaskMemFree(pathThis); CoTaskMemFree(pathOther); CoTaskMemFree(commonPath); free_stringtable(stringTable1); free_stringtable(stringTable2); return ret; }
/***************************************************************************** * WCMD_dir_sort * * Sort based on the /O options supplied on the command line */ static int WCMD_dir_sort (const void *a, const void *b) { const WIN32_FIND_DATAW *filea = (const WIN32_FIND_DATAW *)a; const WIN32_FIND_DATAW *fileb = (const WIN32_FIND_DATAW *)b; int result = 0; /* If /OG or /O-G supplied, dirs go at the top or bottom, ignoring the requested sort order for the directory components */ if (orderGroupDirs && ((filea->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (fileb->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))) { BOOL aDir = filea->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; if (aDir) result = -1; else result = 1; if (orderGroupDirsReverse) result = -result; return result; /* Order by Name: */ } else if (dirOrder == Name) { result = lstrcmpiW(filea->cFileName, fileb->cFileName); /* Order by Size: */ } else if (dirOrder == Size) { ULONG64 sizea = (((ULONG64)filea->nFileSizeHigh) << 32) + filea->nFileSizeLow; ULONG64 sizeb = (((ULONG64)fileb->nFileSizeHigh) << 32) + fileb->nFileSizeLow; if( sizea < sizeb ) result = -1; else if( sizea == sizeb ) result = 0; else result = 1; /* Order by Date: (Takes into account which date (/T option) */ } else if (dirOrder == Date) { const FILETIME *ft; ULONG64 timea, timeb; if (dirTime == Written) { ft = &filea->ftLastWriteTime; timea = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; ft = &fileb->ftLastWriteTime; timeb = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; } else if (dirTime == Access) { ft = &filea->ftLastAccessTime; timea = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; ft = &fileb->ftLastAccessTime; timeb = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; } else { ft = &filea->ftCreationTime; timea = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; ft = &fileb->ftCreationTime; timeb = (((ULONG64)ft->dwHighDateTime) << 32) + ft->dwLowDateTime; } if( timea < timeb ) result = -1; else if( timea == timeb ) result = 0; else result = 1; /* Order by Extension: (Takes into account which date (/T option) */ } else if (dirOrder == Extension) { WCHAR drive[10]; WCHAR dir[MAX_PATH]; WCHAR fname[MAX_PATH]; WCHAR extA[MAX_PATH]; WCHAR extB[MAX_PATH]; /* Split into components */ WCMD_splitpath(filea->cFileName, drive, dir, fname, extA); WCMD_splitpath(fileb->cFileName, drive, dir, fname, extB); result = lstrcmpiW(extA, extB); } if (orderReverse) result = -result; return result; }
bool operator<(const DirInfo& dir_info) const { if (parent == dir_info.parent) return lstrcmpiW(name.c_str(), dir_info.name.c_str()) < 0; else return parent < dir_info.parent; }
__declspec(dllexport) long TITCALL HandlerGetProcessIdWhichCreatedMutexW(wchar_t* szMutexString) { if(!szMutexString || wcslen(szMutexString) >= 450) return 0; HANDLE hProcess = NULL; DWORD ReturnData = NULL; HANDLE myHandle = NULL; ULONG RequiredSize = NULL; DWORD LastProcessId = NULL; ULONG TotalHandleCount = NULL; PNTDLL_QUERY_HANDLE_INFO HandleInfo; char HandleFullData[0x1000] = {0}; char HandleNameData[0x1000] = {0}; PPUBLIC_OBJECT_TYPE_INFORMATION pObjectTypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION)HandleFullData; char ObjectNameInfo[0x2000] = {0}; POBJECT_NAME_INFORMATION pObjectNameInfo = (POBJECT_NAME_INFORMATION)ObjectNameInfo; wchar_t RealMutexName[512] = L"\\BaseNamedObjects\\"; lstrcatW(RealMutexName, szMutexString); DynBuf hinfo; if(!NtQuerySysHandleInfo(hinfo)) return 0; LPVOID QuerySystemBuffer = hinfo.GetPtr(); RtlMoveMemory(&TotalHandleCount, QuerySystemBuffer, sizeof ULONG); QuerySystemBuffer = (LPVOID)((ULONG_PTR)QuerySystemBuffer + 4); HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)QuerySystemBuffer; while(TotalHandleCount > NULL) { if(LastProcessId != HandleInfo->ProcessId) { if(hProcess != NULL) { EngineCloseHandle(hProcess); } hProcess = EngineOpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE, FALSE, HandleInfo->ProcessId); LastProcessId = HandleInfo->ProcessId; } if(hProcess != NULL) { //if(!(HandleInfo->GrantedAccess & SYNCHRONIZE) || ((HandleInfo->GrantedAccess & SYNCHRONIZE) && ((WORD)HandleInfo->GrantedAccess != 0x19F9))){// && (WORD)HandleInfo->GrantedAccess != 0x89))){ if(HandleInfo->GrantedAccess != 0x0012019F) { if(DuplicateHandle(hProcess, (HANDLE)HandleInfo->hHandle, GetCurrentProcess(), &myHandle, NULL, false, DUPLICATE_SAME_ACCESS)) { RtlZeroMemory(HandleFullData, sizeof(HandleFullData)); NtQueryObject(myHandle, ObjectTypeInformation, HandleFullData, 8, &RequiredSize); NtQueryObject(myHandle, ObjectTypeInformation, HandleFullData, RequiredSize, &RequiredSize); RtlZeroMemory(HandleNameData, sizeof(HandleNameData)); if(pObjectTypeInfo->TypeName.Length != NULL) { //WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectTypeInfo->TypeName.Buffer, -1, (LPSTR)HandleNameData, 0x1000, NULL, NULL); lstrcpyW((wchar_t*)HandleNameData, (wchar_t*)pObjectNameInfo->Name.Buffer); if(lstrcmpiW((LPCWSTR)HandleNameData, L"Mutant") == NULL) { NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, 8, &RequiredSize); NtQueryObject(myHandle, ObjectNameInformation, ObjectNameInfo, RequiredSize, &RequiredSize); RtlZeroMemory(HandleNameData, sizeof(HandleNameData)); if(pObjectNameInfo->Name.Length != NULL) { //WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)pObjectNameInfo->Name.Buffer, -1, (LPSTR)HandleNameData, 0x1000, NULL, NULL); lstrcpyW((wchar_t*)HandleNameData, (wchar_t*)pObjectNameInfo->Name.Buffer); if(lstrcmpiW((LPCWSTR)HandleNameData, RealMutexName) == NULL) { ReturnData = HandleInfo->ProcessId; break; } } } } EngineCloseHandle(myHandle); } } } HandleInfo = (PNTDLL_QUERY_HANDLE_INFO)((ULONG_PTR)HandleInfo + sizeof NTDLL_QUERY_HANDLE_INFO); TotalHandleCount--; } return(ReturnData); }
bool GetImageSubsystem(const wchar_t *FileName,DWORD& ImageSubsystem,DWORD& ImageBits/*16/32/64*/,DWORD& FileAttrs) { bool Result = false; ImageSubsystem = IMAGE_SUBSYSTEM_UNKNOWN; ImageBits = 0; FileAttrs = (DWORD)-1; wchar_t* pszExpand = NULL; // Пытаться в UNC? Хотя сам CreateProcess UNC не поддерживает, так что смысла пока нет HANDLE hModuleFile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); // Переменные окружения if ((hModuleFile == INVALID_HANDLE_VALUE) && FileName && wcschr(FileName, L'%')) { pszExpand = ExpandEnvStr(FileName); if (pszExpand) { hModuleFile = CreateFile(pszExpand,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); if (hModuleFile != INVALID_HANDLE_VALUE) { FileName = pszExpand; } } } #if 0 // Если не указан путь к файлу - попробовать найти его в %PATH% if (hModuleFile != INVALID_HANDLE_VALUE && FileName && wcschr(FileName, L'\\') == NULL && wcschr(FileName, L'.') != NULL) { DWORD nErrCode = GetLastError(); if (nErrCode) { wchar_t szFind[MAX_PATH], *psz; DWORD nLen = SearchPath(NULL, FileName, NULL, countof(szFind), szFind, &psz); if (nLen && nLen < countof(szFind)) hModuleFile = CreateFile(szFind,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); } } #endif if (hModuleFile != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION bfi = {0}; IMAGE_DOS_HEADER DOSHeader; DWORD ReadSize; if (GetFileInformationByHandle(hModuleFile, &bfi)) FileAttrs = bfi.dwFileAttributes; // Это это батник - сразу вернуть IMAGE_SUBSYSTEM_BATCH_FILE LPCWSTR pszExt = PointToExt(FileName); if (pszExt && (!lstrcmpi(pszExt, L".cmd") || !lstrcmpiW(pszExt, L".bat") || !lstrcmpiW(pszExt, L".btm") // take command )) { CloseHandle(hModuleFile); ImageSubsystem = IMAGE_SUBSYSTEM_BATCH_FILE; ImageBits = IsWindows64() ? 64 : 32; //-V112 Result = true; goto wrap; } if (ReadFile(hModuleFile,&DOSHeader,sizeof(DOSHeader),&ReadSize,NULL)) { _ASSERTE(IMAGE_DOS_SIGNATURE==0x5A4D); if (DOSHeader.e_magic != IMAGE_DOS_SIGNATURE) { //const wchar_t *pszExt = wcsrchr(FileName, L'.'); if (pszExt && lstrcmpiW(pszExt, L".com") == 0) { ImageSubsystem = IMAGE_SUBSYSTEM_DOS_EXECUTABLE; ImageBits = 16; Result = true; } } else { ImageSubsystem = IMAGE_SUBSYSTEM_DOS_EXECUTABLE; ImageBits = 16; Result = true; if (SetFilePointer(hModuleFile,DOSHeader.e_lfanew,NULL,FILE_BEGIN)) { IMAGE_HEADERS PEHeader; if (ReadFile(hModuleFile,&PEHeader,sizeof(PEHeader),&ReadSize,NULL)) { _ASSERTE(IMAGE_NT_SIGNATURE==0x00004550); if (PEHeader.Signature == IMAGE_NT_SIGNATURE) { switch(PEHeader.OptionalHeader32.Magic) { case IMAGE_NT_OPTIONAL_HDR32_MAGIC: { ImageSubsystem = PEHeader.OptionalHeader32.Subsystem; _ASSERTE((ImageSubsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) || (ImageSubsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)); ImageBits = 32; //-V112 } break; case IMAGE_NT_OPTIONAL_HDR64_MAGIC: { ImageSubsystem = PEHeader.OptionalHeader64.Subsystem; _ASSERTE((ImageSubsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) || (ImageSubsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)); ImageBits = 64; } break; /*default: { // unknown magic }*/ } } else if ((WORD)PEHeader.Signature == IMAGE_OS2_SIGNATURE) { ImageBits = 32; //-V112 /* NE, хмм... а как определить что оно ГУЕВОЕ? Andrzej Novosiolov <*****@*****.**> AN> ориентироваться по флагу "Target operating system" NE-заголовка AN> (1 байт по смещению 0x36). Если там Windows (значения 2, 4) - подразумеваем AN> GUI, если OS/2 и прочая экзотика (остальные значения) - подразумеваем консоль. */ BYTE ne_exetyp = reinterpret_cast<PIMAGE_OS2_HEADER>(&PEHeader)->ne_exetyp; if (ne_exetyp==2||ne_exetyp==4) //-V112 { ImageSubsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI; } else { ImageSubsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI; } } /*else { // unknown signature }*/ } /*else { // обломс вышел с чтением следующего заголовка ;-( }*/ } /*else { // видимо улетели куда нить в трубу, т.к. dos_head.e_lfanew указал // слишком в неправдоподное место (например это чистой воды DOS-файл) }*/ } /*else { // это не исполняемый файл - у него нету заголовка MZ, например, NLM-модуль // TODO: здесь можно разбирать POSIX нотацию, например "/usr/bin/sh" }*/ } /*else { // ошибка чтения }*/ CloseHandle(hModuleFile); } /*else { // ошибка открытия }*/ wrap: SafeFree(pszExpand); return Result; }
/**************************************************************************** FUNCTION: NPLogonNotify PURPOSE: This entry point is called when a user logs on. If the user authentication fails here, the user will still be logged on to the local machine. *******************************************************************************/ DWORD WINAPI NPLogonNotify ( PLUID lpLogonId, LPCWSTR lpAuthentInfoType, LPVOID lpAuthentInfo, LPCWSTR lpPreviousAuthentInfoType, LPVOID lpPreviousAuthentInfo, LPWSTR lpStationName, LPVOID StationHandle, LPWSTR *lpLogonScript ) { PMSV1_0_INTERACTIVE_LOGON pAuthInfo; #ifdef DEBUG TCHAR szBuf[1024]; // For debugging purposes only MessageBeep(0xFFFFFFFF); // // Write out some information about the logon attempt // wsprintf(szBuf, L"lpAuthentInfoType=%s lpStationName=%s\r\n", lpAuthentInfoType, lpStationName); WriteLogFile(szBuf); #endif // // If the primary authenticator is not MSV1_0, return success. // Why? Because this is the only auth info structure that we // understand and we don't want to interact with other types. // if ( lstrcmpiW (MSV1_0_AUTH_TYPE, lpAuthentInfoType) ) { #ifdef DEBUG wsprintf(szBuf, L"Authenticator is not MSV1_0 - Returning.\n"); WriteLogFile(szBuf); #endif SetLastError(NO_ERROR); return NO_ERROR; } // // Do something with the authentication information // pAuthInfo = (PMSV1_0_INTERACTIVE_LOGON) lpAuthentInfo; #ifdef DEBUG wsprintf(szBuf, L"LogonDomain=%s User=%s\r\n", pAuthInfo->LogonDomainName.Buffer, pAuthInfo->UserName.Buffer); WriteLogFile(szBuf); #endif // // Let's utilize the logon script capability to display // our logon information // // The Caller MUST free this memory *lpLogonScript = LocalAlloc(LPTR,1024); #ifdef DEBUG wsprintf(*lpLogonScript,L"notepad %s",LOGFILE); #endif return NO_ERROR; }
BOOL TInstDlg::Install(void) { char buf[MAX_PATH], setupDir[MAX_PATH], setupPath[MAX_PATH]; BOOL is_delay_copy = FALSE; int len; // インストールパス設定 len = GetDlgItemText(FILE_EDIT, setupDir, sizeof(setupDir)); if (setupDir[len-1] == '\\') setupDir[len-1] = 0; Wstr w_setup(setupDir); if (IsWinVista() && TIsVirtualizedDirW(w_setup.Buf())) { if (!::IsUserAnAdmin()) { return RunAsAdmin(TRUE); } else if (cfg.runImme && cfg.setupDir && lstrcmpiW(w_setup.Buf(), cfg.setupDir)) { return MessageBox(GetLoadStr(IDS_ADMINCHANGE)), FALSE; } } CreateDirectory(setupDir, NULL); DWORD attr = GetFileAttributes(setupDir); if (attr == 0xffffffff || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) return MessageBox(GetLoadStr(IDS_NOTCREATEDIR)), FALSE; MakePath(setupPath, setupDir, FASTCOPY_EXE); if (MessageBox(GetLoadStr(IDS_START), INSTALL_STR, MB_OKCANCEL|MB_ICONINFORMATION) != IDOK) return FALSE; // ファイルコピー if (cfg.mode == SETUP_MODE) { char installPath[MAX_PATH], orgDir[MAX_PATH]; ::GetModuleFileName(NULL, orgDir, sizeof(orgDir)); GetParentDir(orgDir, orgDir); for (int cnt=0; SetupFiles[cnt] != NULL; cnt++) { MakePath(buf, orgDir, SetupFiles[cnt]); MakePath(installPath, setupDir, SetupFiles[cnt]); if (MiniCopy(buf, installPath) || IsSameFile(buf, installPath)) continue; if ((strcmp(SetupFiles[cnt], CURRENT_SHEXTDLL_EX) == 0 || strcmp(SetupFiles[cnt], CURRENT_SHEXTDLL) == 0) && DelayCopy(buf, installPath)) { is_delay_copy = TRUE; continue; } return MessageBox(installPath, GetLoadStr(IDS_NOTCREATEFILE)), FALSE; } } // スタートメニュー&デスクトップに登録 char *linkPath[] = { WtoA(cfg.startMenu), WtoA(cfg.deskTop), NULL }; BOOL execFlg[] = { cfg.programLink, cfg.desktopLink, NULL }; for (int cnt=0; linkPath[cnt]; cnt++) { strcpy(buf, linkPath[cnt]); if (cnt != 0 || RemoveSameLink(linkPath[cnt], buf) == FALSE) { ::wsprintf(buf + strlen(buf), "\\%s", FASTCOPY_SHORTCUT); } if (execFlg[cnt]) { Wstr w_setup(setupPath, BY_MBCS); Wstr w_buf(buf, BY_MBCS); SymLinkW(w_setup.Buf(), w_buf.Buf()); } else { Wstr w_buf(buf, BY_MBCS); DeleteLinkW(w_buf.Buf()); } } #if 0 // レジストリにアンインストール情報を登録 if (reg.OpenKey(REGSTR_PATH_UNINSTALL)) { if (reg.CreateKey(FASTCOPY)) { MakePath(buf, setupDir, INSTALL_EXE); strcat(buf, " /r"); reg.SetStr(REGSTR_VAL_UNINSTALLER_DISPLAYNAME, FASTCOPY); reg.SetStr(REGSTR_VAL_UNINSTALLER_COMMANDLINE, buf); reg.CloseKey(); } reg.CloseKey(); } #endif if (IsWinVista() && TIsVirtualizedDirW(w_setup.Buf())) { WCHAR wbuf[MAX_PATH] = L"", old_path[MAX_PATH] = L"", usr_path[MAX_PATH] = L""; WCHAR fastcopy_dir[MAX_PATH], *fastcopy_dirname = NULL; ::GetFullPathNameW(w_setup.Buf(), MAX_PATH, fastcopy_dir, &fastcopy_dirname); if (cfg.appData) { wcscpy(usr_path, cfg.appData); } else { ::SHGetSpecialFolderPathW(NULL, wbuf, CSIDL_APPDATA, FALSE); MakePathW(usr_path, wbuf, fastcopy_dirname); } ConvertVirtualStoreConf(w_setup.Buf(), usr_path, cfg.virtualDir); } // コピーしたアプリケーションを起動 const char *msg = GetLoadStr(is_delay_copy ? IDS_DELAYSETUPCOMPLETE : IDS_SETUPCOMPLETE); int flg = MB_OKCANCEL|MB_ICONINFORMATION; TLaunchDlg dlg(msg, this); if (dlg.Exec() == IDOK) { ShellExecute(NULL, "open", setupPath, "", setupDir, SW_SHOW); } ::PostQuitMessage(0); return TRUE; }
void sys_ShellExecute( PA_PluginParameters params ) { LONG_PTR returnValue = 0; LONG_PTR len = 0; char returnText[255]; // MWD & Mark De Wever #12225 INT_PTR howToShow; //char *pChar; //char *operation = NULL; //char *file = NULL; //char *parameters = NULL; //char *directory = NULL; PA_Unistring *UnistringFile; PA_Unistring *UnistringOperation; PA_Unistring *UnistringParameters; PA_Unistring *UnistringDirectory; PA_Unichar *file; PA_Unichar *operation; PA_Unichar *parameters; PA_Unichar *directory; PA_Unichar *pChar; // Get the function parameters. //operation = getTextParameter(params, 1); //file = getTextParameter(params, 2); //parameters = getTextParameter(params, 3); //directory = getTextParameter(params, 4); UnistringOperation = PA_GetStringParameter( params, 1); UnistringFile = PA_GetStringParameter( params, 2); UnistringParameters = PA_GetStringParameter( params, 3); UnistringDirectory = PA_GetStringParameter( params, 4); howToShow = PA_GetLongParameter( params, 5 ); operation = PA_GetUnistring(UnistringOperation); // AMS /28/14 file = PA_GetUnistring(UnistringFile); // AMS 2/28/14 len = (PA_GetUnistringLength(UnistringFile) + 1); // AMS 2/28/14 parameters = PA_GetUnistring(UnistringParameters); // AMS 2/28/14 directory = PA_GetUnistring(UnistringDirectory); // AMS 2/28/14 //if ((strcmp(_strlwr(operation), "open") != 0) && // (strcmp(_strlwr(operation), "explore") != 0) && // (strcmp(_strlwr(operation), "print") != 0) && // (file == NULL || strlen(file) == 0)) { // //strcpy(returnText, "Invalid Operation"); // strncpy(returnText, message->InvalidOperation, 255); // Mark De Wever #12225 replaced the line above //} if((lstrcmpiW(operation, L"open") != 0) && (lstrcmpiW(operation, L"explore") != 0) && (lstrcmpiW(operation, L"print") != 0) && (file == NULL || len == 0)) { strncpy(returnText, message->InvalidOperation, 255); } else if (howToShow > 11) { //strcpy(returnText, "Invalid HowToShow Constant"); strncpy(returnText, message->InvalidShowConstant, 255); // Mark De Wever #12225 replaced the line above } else { pChar = file; // added 10/28/02 shellExecute wants backslashes do { if (*pChar == '/') { *pChar = '\\'; } } while (*pChar++ != '\0') ; if (directory != NULL) { pChar = directory; do { if (*pChar == '/') { *pChar = '\\'; } } while (*pChar++ != '\0'); } CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); // AMS 5/6/14 #38727 returnValue = (LONG_PTR) ShellExecuteW(NULL, operation, file, parameters, directory, howToShow); strcpy(returnText, ""); if (returnValue <= 32) { // error occurred switch (returnValue) { case ERROR_FILE_NOT_FOUND : //strcpy(returnText, "File Not Found"); strncpy(returnText, message->FileNotFound, 255); // Mark De Wever #12225 replaced line above break; case ERROR_PATH_NOT_FOUND : //strcpy(returnText, "Path Not Found"); strncpy(returnText, message->PathNotFound, 255); // Mark De Wever #12225 Replaced line above break; case ERROR_BAD_FORMAT : //strcpy(returnText, ".EXE File is Invalid"); strncpy(returnText, message->BadFormat, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_ACCESSDENIED : //strcpy(returnText, "OS Denied Access to File"); strncpy(returnText, message->AccessDenied, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_ASSOCINCOMPLETE : //strcpy(returnText, "File Name Association is Incomplete or Invalid"); strncpy(returnText, message->AssocIncomplete, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_DDEBUSY : case SE_ERR_DDEFAIL : //strcpy(returnText, "DDE Transaction Could Not be Completed"); strncpy(returnText, message->DDEFail, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_DDETIMEOUT : //strcpy(returnText, "DDE Request Timed Out"); strncpy(returnText, message->DDETimeOut, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_DLLNOTFOUND : //strcpy(returnText, "DLL Libray Not Found"); strncpy(returnText, message->DLLNotFound, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_NOASSOC : //strcpy(returnText, "No Application Associated with File Extenstion"); strncpy(returnText, message->NoAssoc, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_OOM : //strcpy(returnText, "Insufficient Memory"); strncpy(returnText, message->OOM, 255); // Mark De Wever #12225 Replaced line above break; case SE_ERR_SHARE : //strcpy(returnText, "Sharing Violation Occurred"); strncpy(returnText, message->ShareViolation, 255); // Mark De Wever #12225 Replaced line above break; default: //strcpy(returnText, "Unknown error occurred"); strncpy(returnText, message->Default, 255); // Mark De Wever #12225 Replaced line above break; } } } //freeTextParameter(operation); //freeTextParameter(file); //freeTextParameter(parameters); //freeTextParameter(directory); PA_ReturnText( params, returnText, strlen(returnText)); }
int wmain(int argc, WCHAR *argvW[]) { int i; static const WCHAR addW[] = {'a','d','d',0}; static const WCHAR deleteW[] = {'d','e','l','e','t','e',0}; static const WCHAR queryW[] = {'q','u','e','r','y',0}; static const WCHAR slashDW[] = {'/','d',0}; static const WCHAR slashFW[] = {'/','f',0}; static const WCHAR slashHW[] = {'/','h',0}; static const WCHAR slashSW[] = {'/','s',0}; static const WCHAR slashTW[] = {'/','t',0}; static const WCHAR slashVW[] = {'/','v',0}; static const WCHAR slashVAW[] = {'/','v','a',0}; static const WCHAR slashVEW[] = {'/','v','e',0}; static const WCHAR slashHelpW[] = {'/','?',0}; if (argc < 2 || !lstrcmpW(argvW[1], slashHelpW) || !lstrcmpiW(argvW[1], slashHW)) { output_message(STRING_USAGE); return 0; } if (!lstrcmpiW(argvW[1], addW)) { WCHAR *key_name, *value_name = NULL, *type = NULL, separator = '\0', *data = NULL; BOOL value_empty = FALSE, force = FALSE; if (argc < 3) { output_message(STRING_INVALID_CMDLINE); return 1; } else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) || !lstrcmpiW(argvW[2], slashHW))) { output_message(STRING_ADD_USAGE); return 0; } key_name = argvW[2]; for (i = 1; i < argc; i++) { if (!lstrcmpiW(argvW[i], slashVW)) { if (value_name || !(value_name = argvW[++i])) { output_message(STRING_INVALID_CMDLINE); return 1; } } else if (!lstrcmpiW(argvW[i], slashVEW)) value_empty = TRUE; else if (!lstrcmpiW(argvW[i], slashTW)) type = argvW[++i]; else if (!lstrcmpiW(argvW[i], slashSW)) { WCHAR *ptr = argvW[++i]; if (!ptr || strlenW(ptr) != 1) { output_message(STRING_INVALID_CMDLINE); return 1; } separator = ptr[0]; } else if (!lstrcmpiW(argvW[i], slashDW)) { if (!(data = argvW[++i])) { output_message(STRING_INVALID_CMDLINE); return 1; } } else if (!lstrcmpiW(argvW[i], slashFW)) force = TRUE; } return reg_add(key_name, value_name, value_empty, type, separator, data, force); } else if (!lstrcmpiW(argvW[1], deleteW)) { WCHAR *key_name, *value_name = NULL; BOOL value_empty = FALSE, value_all = FALSE, force = FALSE; if (argc < 3) { output_message(STRING_INVALID_CMDLINE); return 1; } else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) || !lstrcmpiW(argvW[2], slashHW))) { output_message(STRING_DELETE_USAGE); return 0; } key_name = argvW[2]; for (i = 1; i < argc; i++) { if (!lstrcmpiW(argvW[i], slashVW)) { if (value_name || !(value_name = argvW[++i])) { output_message(STRING_INVALID_CMDLINE); return 1; } } else if (!lstrcmpiW(argvW[i], slashVEW)) value_empty = TRUE; else if (!lstrcmpiW(argvW[i], slashVAW)) value_all = TRUE; else if (!lstrcmpiW(argvW[i], slashFW)) force = TRUE; } return reg_delete(key_name, value_name, value_empty, value_all, force); } else if (!lstrcmpiW(argvW[1], queryW)) { WCHAR *key_name, *value_name = NULL; BOOL value_empty = FALSE, subkey = FALSE; if (argc < 3) { output_message(STRING_INVALID_CMDLINE); return 1; } else if (argc == 3 && (!lstrcmpW(argvW[2], slashHelpW) || !lstrcmpiW(argvW[2], slashHW))) { output_message(STRING_QUERY_USAGE); return 0; } key_name = argvW[2]; for (i = 1; i < argc; i++) { if (!lstrcmpiW(argvW[i], slashVW)) { if (value_name || !(value_name = argvW[++i])) { output_message(STRING_INVALID_CMDLINE); return 1; } } else if (!lstrcmpiW(argvW[i], slashVEW)) value_empty = TRUE; else if (!lstrcmpiW(argvW[i], slashSW)) subkey = TRUE; } return reg_query(key_name, value_name, value_empty, subkey); } else { output_message(STRING_INVALID_CMDLINE); return 1; } }
bool IsNeedCmd(BOOL bRootCmd, LPCWSTR asCmdLine, CmdArg &szExe, LPCWSTR* rsArguments /*= NULL*/, BOOL* rpbNeedCutStartEndQuot /*= NULL*/, BOOL* rpbRootIsCmdExe /*= NULL*/, BOOL* rpbAlwaysConfirmExit /*= NULL*/, BOOL* rpbAutoDisableConfirmExit /*= NULL*/) { _ASSERTE(asCmdLine && *asCmdLine); bool rbNeedCutStartEndQuot = false; bool rbRootIsCmdExe = true; bool rbAlwaysConfirmExit = false; bool rbAutoDisableConfirmExit = false; wchar_t *pwszEndSpace; if (rsArguments) *rsArguments = NULL; bool lbRc = false; int iRc = 0; BOOL lbFirstWasGot = FALSE; LPCWSTR pwszCopy; int nLastChar; #ifdef _DEBUG // Это минимальные проверки, собственно к коду - не относятся CmdArg szDbgFirst; bool bIsBatch = false; { LPCWSTR psz = asCmdLine; NextArg(&psz, szDbgFirst); psz = PointToExt(szDbgFirst); if (lstrcmpi(psz, L".cmd")==0 || lstrcmpi(psz, L".bat")==0) bIsBatch = true; } #endif if (!szExe.GetBuffer(MAX_PATH)) { _ASSERTE(FALSE && "Failed to allocate MAX_PATH"); lbRc = true; goto wrap; } szExe.Empty(); if (!asCmdLine || *asCmdLine == 0) { _ASSERTE(asCmdLine && *asCmdLine); lbRc = true; goto wrap; } pwszCopy = asCmdLine; // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" nLastChar = lstrlenW(pwszCopy) - 1; if (pwszCopy[0] == L'"' && pwszCopy[nLastChar] == L'"') { //if (pwszCopy[1] == L'"' && pwszCopy[2]) //{ // pwszCopy ++; // Отбросить первую кавычку в командах типа: ""c:\program files\arc\7z.exe" -?" // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} //else // глючила на ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" //if (wcschr(pwszCopy+1, L'"') == (pwszCopy+nLastChar)) { // LPCWSTR pwszTemp = pwszCopy; // // Получим первую команду (исполняемый файл?) // if ((iRc = NextArg(&pwszTemp, szArg)) != 0) { // //Parsing command line failed // lbRc = true; goto wrap; // } // pwszCopy ++; // Отбросить первую кавычку в командах типа: "c:\arc\7z.exe -?" // lbFirstWasGot = TRUE; // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} else { // Will be dequoted in 'NextArg' function. Examples // "C:\GCC\msys\bin\make.EXE -f "makefile" COMMON="../../../plugins/common"" // ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" // ""cmd"" // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" LPCWSTR pwszTemp = pwszCopy; // Получим первую команду (исполняемый файл?) if ((iRc = NextArg(&pwszTemp, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } LPCWSTR pwszQ = pwszCopy + 1 + lstrlen(szExe); wchar_t* pszExpand = NULL; if (*pwszQ != L'"' && IsExecutable(szExe, &pszExpand)) { pwszCopy ++; // отбрасываем lbFirstWasGot = TRUE; if (pszExpand) { szExe.Set(pszExpand); SafeFree(pszExpand); if (rsArguments) *rsArguments = pwszQ; } rbNeedCutStartEndQuot = true; } } } // Получим первую команду (исполняемый файл?) if (!lbFirstWasGot) { szExe.Empty(); // 17.10.2010 - поддержка переданного исполняемого файла без параметров, но с пробелами в пути LPCWSTR pchEnd = pwszCopy + lstrlenW(pwszCopy); while (pchEnd > pwszCopy && *(pchEnd-1) == L' ') pchEnd--; if ((pchEnd - pwszCopy) < MAX_PATH) { szExe.Set(pwszCopy, (pchEnd - pwszCopy)); _ASSERTE(szExe[(pchEnd - pwszCopy)] == 0); if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pchEnd; } else { szExe.Empty(); } } if (szExe[0] == 0) { if ((iRc = NextArg(&pwszCopy, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pwszCopy; } } } if (!*szExe) { _ASSERTE(szExe[0] != 0); } else { // Если юзеру нужен редирект - то он должен явно указать ком.процессор // Иначе нереально (или достаточно сложно) определить, является ли символ // редиректом, или это просто один из аргументов команды... // "Левые" символы в имени файла (а вот в "первом аргументе" все однозначно) if (wcspbrk(szExe, L"?*<>|")) { rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } // если "путь" не указан if (wcschr(szExe, L'\\') == NULL) { bool bHasExt = (wcschr(szExe, L'.') != NULL); // Проверим, может это команда процессора (типа "DIR")? if (!bHasExt) { bool bIsCommand = false; wchar_t* pszUppr = lstrdup(szExe); if (pszUppr) { // избежать линковки на user32.dll //CharUpperBuff(pszUppr, lstrlen(pszUppr)); for (wchar_t* p = pszUppr; *p; p++) { if (*p >= L'a' && *p <= 'z') *p -= 0x20; } const wchar_t* pszFind = gsInternalCommands; while (*pszFind) { if (lstrcmp(pszUppr, pszFind) == 0) { bIsCommand = true; break; } pszFind += lstrlen(pszFind)+1; } free(pszUppr); } if (bIsCommand) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } } // Пробуем найти "по путям" соответствующий exe-шник. INT_PTR nCchMax = szExe.mn_MaxLen; // выделить память, длинее чем szExe вернуть не сможем wchar_t* pszSearch = (wchar_t*)malloc(nCchMax*sizeof(wchar_t)); if (pszSearch) { #ifndef CONEMU_MINIMAL MWow64Disable wow; wow.Disable(); // Отключить редиректор! #endif wchar_t *pszName = NULL; INT_PTR nRc = SearchPath(NULL, szExe, bHasExt ? NULL : L".exe", (DWORD)nCchMax, pszSearch, &pszName); if (nRc && (nRc < nCchMax)) { // Нашли, возвращаем что нашли szExe.Set(pszSearch); } free(pszSearch); } } // end: if (wcschr(szExe, L'\\') == NULL) } // Если szExe не содержит путь к файлу - запускаем через cmd // "start "" C:\Utils\Files\Hiew32\hiew32.exe C:\00\Far.exe" if (!IsFilePath(szExe)) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } //pwszCopy = wcsrchr(szArg, L'\\'); if (!pwszCopy) pwszCopy = szArg; else pwszCopy ++; pwszCopy = PointToName(szExe); //2009-08-27 pwszEndSpace = szExe.ms_Arg + lstrlenW(szExe) - 1; while ((*pwszEndSpace == L' ') && (pwszEndSpace > szExe)) { *(pwszEndSpace--) = 0; } #ifndef __GNUC__ #pragma warning( push ) #pragma warning(disable : 6400) #endif if (lstrcmpiW(pwszCopy, L"cmd")==0 || lstrcmpiW(pwszCopy, L"cmd.exe")==0 || lstrcmpiW(pwszCopy, L"tcc")==0 || lstrcmpiW(pwszCopy, L"tcc.exe")==0) { rbRootIsCmdExe = TRUE; // уже должен быть выставлен, но проверим rbAlwaysConfirmExit = TRUE; rbAutoDisableConfirmExit = FALSE; _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан командный процессор, cmd.exe в начало добавлять не нужно } // Issue 1211: Decide not to do weird heuristic. // If user REALLY needs redirection (root command, huh?) // - he must call "cmd /c ..." directly // Если есть одна из команд перенаправления, или слияния - нужен CMD.EXE if (!bRootCmd) { if (wcschr(asCmdLine, L'&') || wcschr(asCmdLine, L'>') || wcschr(asCmdLine, L'<') || wcschr(asCmdLine, L'|') || wcschr(asCmdLine, L'^') // или экранирования ) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } } //if (lstrcmpiW(pwszCopy, L"far")==0 || lstrcmpiW(pwszCopy, L"far.exe")==0) if (IsFarExe(pwszCopy)) { bool bFound = (wcschr(pwszCopy, L'.') != NULL); // Если указали при запуске просто "far" - это может быть батник, расположенный в %PATH% if (!bFound) { wchar_t szSearch[MAX_PATH+1], *pszPart = NULL; DWORD n = SearchPath(NULL, pwszCopy, L".exe", countof(szSearch), szSearch, &pszPart); if (n && (n < countof(szSearch))) { if (lstrcmpi(PointToExt(pszPart), L".exe") == 0) bFound = true; } } if (bFound) { rbAutoDisableConfirmExit = TRUE; rbRootIsCmdExe = FALSE; // FAR! _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан исполняемый файл, cmd.exe в начало добавлять не нужно } } if (IsExecutable(szExe)) { rbRootIsCmdExe = FALSE; // Для других программ - буфер не включаем _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // Запускается конкретная консольная программа. cmd.exe не требуется } //Можно еще Доделать поиски с: SearchPath, GetFullPathName, добавив расширения .exe & .com //хотя фар сам формирует полные пути к командам, так что можно не заморачиваться #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; #ifndef __GNUC__ #pragma warning( pop ) #endif lbRc = true; wrap: if (rpbNeedCutStartEndQuot) *rpbNeedCutStartEndQuot = rbNeedCutStartEndQuot; if (rpbRootIsCmdExe) *rpbRootIsCmdExe = rbRootIsCmdExe; if (rpbAlwaysConfirmExit) *rpbAlwaysConfirmExit = rbAlwaysConfirmExit; if (rpbAutoDisableConfirmExit) *rpbAutoDisableConfirmExit = rbAutoDisableConfirmExit; return lbRc; }
NS_IMETHODIMP nsLookAndFeel::GetMetric(const nsMetricID aID, PRInt32 & aMetric) { nsresult res = nsXPLookAndFeel::GetMetric(aID, aMetric); if (NS_SUCCEEDED(res)) return res; res = NS_OK; switch (aID) { case eMetric_WindowTitleHeight: aMetric = ::GetSystemMetrics(SM_CYCAPTION); break; #ifndef WINCE case eMetric_WindowBorderWidth: aMetric = ::GetSystemMetrics(SM_CXFRAME); break; case eMetric_WindowBorderHeight: aMetric = ::GetSystemMetrics(SM_CYFRAME); break; #endif case eMetric_Widget3DBorder: aMetric = ::GetSystemMetrics(SM_CXEDGE); break; case eMetric_TextFieldBorder: aMetric = 3; break; case eMetric_TextFieldHeight: aMetric = 24; break; case eMetric_ButtonHorizontalInsidePaddingNavQuirks: aMetric = 10; break; case eMetric_ButtonHorizontalInsidePaddingOffsetNavQuirks: aMetric = 8; break; case eMetric_CheckboxSize: aMetric = 12; break; case eMetric_RadioboxSize: aMetric = 12; break; case eMetric_TextHorizontalInsideMinimumPadding: aMetric = 3; break; case eMetric_TextVerticalInsidePadding: aMetric = 0; break; case eMetric_TextShouldUseVerticalInsidePadding: aMetric = 0; break; case eMetric_TextShouldUseHorizontalInsideMinimumPadding: aMetric = 1; break; case eMetric_ListShouldUseHorizontalInsideMinimumPadding: aMetric = 0; break; case eMetric_ListHorizontalInsideMinimumPadding: aMetric = 3; break; case eMetric_ListShouldUseVerticalInsidePadding: aMetric = 0; break; case eMetric_ListVerticalInsidePadding: aMetric = 0; break; case eMetric_CaretBlinkTime: aMetric = (PRInt32)::GetCaretBlinkTime(); break; case eMetric_CaretWidth: aMetric = 1; break; case eMetric_ShowCaretDuringSelection: aMetric = 0; break; case eMetric_SelectTextfieldsOnKeyFocus: // Select textfield content when focused by kbd // used by nsEventStateManager::sTextfieldSelectModel aMetric = 1; break; case eMetric_SubmenuDelay: // This will default to the Windows' default // (400ms) on error. aMetric = GetSystemParam(SPI_GETMENUSHOWDELAY, 400); break; case eMetric_MenusCanOverlapOSBar: // we want XUL popups to be able to overlap the task bar. aMetric = 1; break; case eMetric_DragFullWindow: // This will default to the Windows' default // (on by default) on error. aMetric = GetSystemParam(SPI_GETDRAGFULLWINDOWS, 1); break; #ifndef WINCE case eMetric_DragThresholdX: // The system metric is the number of pixels at which a drag should // start. Our look and feel metric is the number of pixels you can // move before starting a drag, so subtract 1. aMetric = ::GetSystemMetrics(SM_CXDRAG) - 1; break; case eMetric_DragThresholdY: aMetric = ::GetSystemMetrics(SM_CYDRAG) - 1; break; case eMetric_UseAccessibilityTheme: // High contrast is a misnomer under Win32 -- any theme can be used with it, // e.g. normal contrast with large fonts, low contrast, etc. // The high contrast flag really means -- use this theme and don't override it. HIGHCONTRAST contrastThemeInfo; contrastThemeInfo.cbSize = sizeof(contrastThemeInfo); ::SystemParametersInfo(SPI_GETHIGHCONTRAST, 0, &contrastThemeInfo, 0); aMetric = ((contrastThemeInfo.dwFlags & HCF_HIGHCONTRASTON) != 0); break; case eMetric_IsScreenReaderActive: // This will default to the Windows' default // (off by default) on error. aMetric = GetSystemParam(SPI_GETSCREENREADER, 0); break; #endif case eMetric_ScrollArrowStyle: aMetric = eMetric_ScrollArrowStyleSingle; break; case eMetric_ScrollSliderStyle: aMetric = eMetric_ScrollThumbStyleProportional; break; case eMetric_TreeOpenDelay: aMetric = 1000; break; case eMetric_TreeCloseDelay: aMetric = 0; break; case eMetric_TreeLazyScrollDelay: aMetric = 150; break; case eMetric_TreeScrollDelay: aMetric = 100; break; case eMetric_TreeScrollLinesMax: aMetric = 3; break; case eMetric_WindowsDefaultTheme: aMetric = 0; #ifndef WINCE if (getCurrentThemeName) { WCHAR themeFileName[MAX_PATH + 1] = {L'\0'}; HRESULT hresult = getCurrentThemeName(themeFileName, MAX_PATH, NULL, 0, NULL, 0); // WIN2K and earlier will not have getCurrentThemeName defined, so // they will never make it this far. Unless we want to save 6.0 // users a handful of clock cycles by skipping checks for the // 5.x themes (or vice-versa), we can use a single loop for all // the different Windows versions. if (hresult == S_OK && GetWindowsVersion() <= VISTA_VERSION) { LPCWSTR defThemes[] = { L"luna.msstyles", L"royale.msstyles", L"zune.msstyles", L"aero.msstyles" }; LPWSTR curTheme = wcsrchr(themeFileName, L'\\'); curTheme = curTheme ? curTheme + 1 : themeFileName; for (int i = 0; i < NS_ARRAY_LENGTH(defThemes); ++i) { if (!lstrcmpiW(curTheme, defThemes[i])) { aMetric = 1; } } } else { res = NS_ERROR_NOT_IMPLEMENTED; } } else #endif { res = NS_ERROR_NOT_IMPLEMENTED; } break; #ifndef WINCE case eMetric_AlertNotificationOrigin: aMetric = 0; if (gSHAppBarMessage) { // Get task bar window handle HWND shellWindow = FindWindow("Shell_TrayWnd", NULL); if (shellWindow != NULL) { // Determine position APPBARDATA appBarData; appBarData.hWnd = shellWindow; appBarData.cbSize = sizeof(appBarData); if (gSHAppBarMessage(ABM_GETTASKBARPOS, &appBarData)) { // Set alert origin as a bit field - see nsILookAndFeel.h // 0 represents bottom right, sliding vertically. switch(appBarData.uEdge) { case ABE_LEFT: aMetric = NS_ALERT_HORIZONTAL | NS_ALERT_LEFT; break; case ABE_RIGHT: aMetric = NS_ALERT_HORIZONTAL; break; case ABE_TOP: aMetric = NS_ALERT_TOP; // fall through for the right-to-left handling. case ABE_BOTTOM: // If the task bar is right-to-left, // move the origin to the left if (::GetWindowLong(shellWindow, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) aMetric |= NS_ALERT_LEFT; break; } } } } break; #endif case eMetric_IMERawInputUnderlineStyle: case eMetric_IMEConvertedTextUnderlineStyle: aMetric = NS_UNDERLINE_STYLE_DASHED; break; case eMetric_IMESelectedRawTextUnderlineStyle: case eMetric_IMESelectedConvertedTextUnderline: aMetric = NS_UNDERLINE_STYLE_NONE; break; default: aMetric = 0; res = NS_ERROR_FAILURE; } return res; }
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; }
HRESULT ExchangeAdmin::GetAllProfiles(vector<string> &vProfileList) { HRESULT hr = S_OK; Zimbra::Util::ScopedInterface<IMAPITable> pProftable; // get profile table if ((hr = m_pProfAdmin->GetProfileTable(0, pProftable.getptr())) == S_OK) { SizedSPropTagArray(3, proftablecols) = { 3, { PR_DISPLAY_NAME_A, PR_DEFAULT_PROFILE, PR_SERVICE_NAME } }; Zimbra::Util::ScopedRowSet profrows; // get all profile rows if ((hr = HrQueryAllRows(pProftable.get(), (SPropTagArray *)&proftablecols, NULL, NULL, 0, profrows.getptr())) == S_OK) { for (unsigned int i = 0; i < profrows->cRows; i++) { if (profrows->aRow[i].lpProps[0].ulPropTag == PR_DISPLAY_NAME_A) { Zimbra::Util::ScopedInterface<IMsgServiceAdmin> spServiceAdmin; Zimbra::Util::ScopedInterface<IMAPITable> spServiceTable; string strpname = profrows->aRow[i].lpProps[0].Value.lpszA; // get profile's admin service hr = m_pProfAdmin->AdminServices((LPTSTR)strpname.c_str(), NULL, NULL, 0, spServiceAdmin.getptr()); if (FAILED(hr)) throw ExchangeAdminException(hr,L"GetAllProfiles(): AdminServices Failed.", ERR_GETALL_PROFILE, __LINE__, __FILE__); // get message service table hr = spServiceAdmin->GetMsgServiceTable(0, spServiceTable.getptr()); if (FAILED(hr)) { throw ExchangeAdminException(hr,L"GetAllProfiles(): GetMsgServiceTable Failed.", ERR_GETALL_PROFILE, __LINE__, __FILE__); } // lets get the service name and the service uid for the primary service SizedSPropTagArray(2, tags) = { 2, { PR_SERVICE_NAME, PR_SERVICE_UID } }; spServiceTable->SetColumns((LPSPropTagArray) & tags, 0); DWORD dwCount = 0; hr = spServiceTable->GetRowCount(0, &dwCount); if (FAILED(hr)) throw ExchangeAdminException(hr, L"GetAllProfiles(): GetRowCount Failed.", ERR_GETALL_PROFILE, __LINE__, __FILE__); else if (!dwCount) return hr; Zimbra::Util::ScopedRowSet pRows; hr = spServiceTable->QueryRows(dwCount, 0, pRows.getptr()); if (FAILED(hr)) throw ExchangeAdminException(hr, L"GetAllProfiles(): QueryRows Failed.", ERR_GETALL_PROFILE, __LINE__, __FILE__); for (ULONG j = 0; j < pRows->cRows; j++) { if (PR_SERVICE_NAME == pRows->aRow[j].lpProps[0].ulPropTag) { // if MSExchange service if (0 == lstrcmpiW(pRows->aRow[j].lpProps[0].Value.LPSZ, L"MSEMS")) { if (profrows->aRow[i].lpProps[0].ulPropTag == PR_DISPLAY_NAME_A) vProfileList.push_back( profrows->aRow[i].lpProps[0].Value.lpszA); break; } } } } } } } return hr; }
bool DominoConnector::GetInfoFromFileName(const std::wstring& fileName, std::wstring& repositoryId, std::wstring& artifactId, std::wstring& artifactVersionLabel) { USES_CONVERSION; if(!PathFileExistsW(fileName.c_str())) throw Workshare::System::IO::FileNotFoundException(fileName.c_str(), _T("The filename must exist in order to extract Lotus Domino.Doc information from the document")); DWORD grfMode = STGM_READWRITE | STGM_SHARE_EXCLUSIVE; IStorage* pStorage = NULL; HRESULT hr = ::StgOpenStorage(fileName.c_str(), NULL, grfMode, NULL, 0, &pStorage); switch(hr) { case S_OK: break; case STG_E_LOCKVIOLATION: case STG_E_SHAREVIOLATION: case STG_E_ACCESSDENIED: { ILockBytesPtr spLockBytes(ReadFileIntoMemory(fileName.c_str()), false); hr = ::StgOpenStorageOnILockBytes(spLockBytes, NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, NULL, 0, &pStorage); if(FAILED(hr)) { std::tostringstream msg; msg << _T("The file, [") << fileName.c_str() << _T("], has been locked. An attempt was made to read it into memory (into an instance of ILockBytes) and open a storage from there, but that failed too.") << std::ends; throw Workshare::Com::ComException(msg.str().c_str(), hr); } } break; default: { std::tostringstream msg; msg << _T("Failed to open [") << fileName.c_str() << _T("] using StgOpenStorage while checking to see whether the document has Domino.Doc properties or not.") << std::ends; throw Workshare::Com::ComException(msg.str().c_str(), hr); } break; } IStoragePtr spStorage(pStorage, false); IPropertySetStoragePtr spPropertySetStorage(spStorage); IPropertyStorage* pPropertyStorage = NULL; hr = spPropertySetStorage->Open(FMTID_UserDefinedProperties, grfMode, &pPropertyStorage); if(FAILED(hr)) { Log(_T("Failed to open the custom properties storage from [%S] while trying to determine whether its a Domino.Doc document or not."), fileName.c_str()); return false; } IPropertyStoragePtr spPropertyStorage(pPropertyStorage, false); IEnumSTATPROPSTG *pEnumSTATPROPSTG = NULL; hr = spPropertyStorage->Enum(&pEnumSTATPROPSTG); if(FAILED(hr)) { std::tostringstream msg; msg << _T("Failed to obtain an enumeration for the custom properties of [") << fileName.c_str() << _T("] while checking to see whether the document has Domino.Doc properties or not.") << std::ends; throw Workshare::Com::ComException(msg.str().c_str(), hr); } IEnumSTATPROPSTGPtr spEnum(pEnumSTATPROPSTG, false); bool isDominoDocument = false; STATPROPSTG property; hr = spEnum->Next(1, &property, NULL); while(S_OK == hr) { PROPSPEC specification; PROPVARIANT value; PropVariantInit(&value); try { // Build a PROPSPEC for this property. ZeroMemory(&specification, sizeof(specification)); specification.ulKind = PRSPEC_PROPID; specification.propid = property.propid; hr = spPropertyStorage->ReadMultiple(1, &specification, &value); if(FAILED(hr)) { std::tostringstream msg; msg << _T("Failed to read the property with id [") << property.propid << _T("] from the custom properties of [") << fileName.c_str() << _T("] while checking to see whether the document has Domino.Doc properties or not.") << std::ends; throw Workshare::Com::ComException(msg.str().c_str(), hr); } if(value.vt == VT_LPSTR) { if(0 == lstrcmpiW(property.lpwstrName, L"DDocLibrary")) { isDominoDocument = true; repositoryId = A2W(value.pszVal); } else if(0 == lstrcmpiW(property.lpwstrName, L"DDocRevision")) { isDominoDocument = true; artifactVersionLabel = A2W(value.pszVal); } else if(0 == lstrcmpiW(property.lpwstrName, L"DDocID")) { isDominoDocument = true; artifactId = A2W(value.pszVal); } } else if(value.vt == VT_LPWSTR) { if(0 == lstrcmpiW(property.lpwstrName, L"DDocLibrary")) { isDominoDocument = true; repositoryId = value.pwszVal; } else if(0 == lstrcmpiW(property.lpwstrName, L"DDocRevision")) { isDominoDocument = true; artifactVersionLabel = value.pwszVal; } else if(0 == lstrcmpiW(property.lpwstrName, L"DDocID")) { isDominoDocument = true; artifactId = value.pwszVal; } } PropVariantClear(&value); } catch(...) { //TODO: Do we need to deal with failure to free a resource? PropVariantClear(&value); throw; } hr = spEnum->Next(1, &property, NULL); } return isDominoDocument; }
/*********************************************************************** * drvGetDefaultCommConfigW (SERIALUI.@) * * Used by Win9x KERNEL to get the default config for a COMM port * FIXME: uses the wrong registry key... should use a digit, not * the comm port name. */ DWORD WINAPI drvGetDefaultCommConfigW( LPCWSTR lpszDevice, LPCOMMCONFIG lpCommConfig, LPDWORD lpdwSize) { HKEY hKeyReg, hKeyPort; WCHAR szKeyName[100]; DWORD r,dwSize,dwType; static const WCHAR fmt[] = {'%','s','\\','%','s',0 }; TRACE("(%s, %p, %p) *lpdwSize: %u\n", debugstr_w(lpszDevice), lpCommConfig, lpdwSize, lpdwSize ? *lpdwSize : 0); if ((!lpszDevice) || (!lpCommConfig) || (!lpdwSize)) { return ERROR_INVALID_PARAMETER; } if (*lpdwSize < sizeof (COMMCONFIG)) { *lpdwSize = sizeof (COMMCONFIG); return ERROR_INSUFFICIENT_BUFFER; } /* only "com1" - "com9" is allowed */ r = sizeof(comW) / sizeof(WCHAR); /* len of "com\0" */ lstrcpynW(szKeyName, lpszDevice, r); /* simulate a lstrcmpnW */ r--; if( lstrcmpiW(szKeyName, comW) || (lpszDevice[r] < '1') || (lpszDevice[r] > '9') || lpszDevice[r+1]) { return ERROR_BADKEY; } *lpdwSize = sizeof (COMMCONFIG); memset(lpCommConfig, 0 , sizeof (COMMCONFIG)); lpCommConfig->dwSize = sizeof (COMMCONFIG); lpCommConfig->wVersion = 1; lpCommConfig->dwProviderSubType = PST_RS232; r = RegConnectRegistryW(NULL, HKEY_LOCAL_MACHINE, &hKeyReg); if(r != ERROR_SUCCESS) return r; snprintfW(szKeyName, sizeof(szKeyName)/sizeof(WCHAR), fmt, lpszCommKey ,lpszDevice); r = RegOpenKeyW(hKeyReg, szKeyName, &hKeyPort); if(r == ERROR_SUCCESS) { dwSize = sizeof (DCB); dwType = 0; r = RegQueryValueExW( hKeyPort, lpszDCB, NULL, &dwType, (LPBYTE)&lpCommConfig->dcb, &dwSize); RegCloseKey(hKeyPort); if ((r!=ERROR_SUCCESS) || (dwType != REG_BINARY) || (dwSize != sizeof(DCB))) { RegCloseKey(hKeyReg); return ERROR_INVALID_PARAMETER; } } else { /* FIXME: default to a hardcoded commconfig */ lpCommConfig->dcb.DCBlength = sizeof(DCB); lpCommConfig->dcb.BaudRate = 9600; lpCommConfig->dcb.fBinary = TRUE; lpCommConfig->dcb.fParity = FALSE; lpCommConfig->dcb.ByteSize = 8; lpCommConfig->dcb.Parity = NOPARITY; lpCommConfig->dcb.StopBits = ONESTOPBIT; return ERROR_SUCCESS; } RegCloseKey(hKeyReg); return r; }