HRESULT CQueryAssociations::GetExecutable(LPCWSTR pszExtra, LPWSTR path, DWORD pathlen, DWORD *len) { WCHAR *pszCommand; WCHAR *pszStart; WCHAR *pszEnd; HRESULT hr = this->GetCommand(pszExtra, &pszCommand); if (FAILED(hr)) { return hr; } DWORD expLen = ExpandEnvironmentStringsW(pszCommand, NULL, 0); if (expLen > 0) { expLen++; WCHAR *buf = static_cast<WCHAR *>(HeapAlloc(GetProcessHeap(), 0, expLen * sizeof(WCHAR))); ExpandEnvironmentStringsW(pszCommand, buf, expLen); HeapFree(GetProcessHeap(), 0, pszCommand); pszCommand = buf; } /* cleanup pszCommand */ if (pszCommand[0] == '"') { pszStart = pszCommand + 1; pszEnd = strchrW(pszStart, '"'); if (pszEnd) { *pszEnd = 0; } *len = SearchPathW(NULL, pszStart, NULL, pathlen, path, NULL); } else { pszStart = pszCommand; for (pszEnd = pszStart; (pszEnd = strchrW(pszEnd, ' ')); pszEnd++) { WCHAR c = *pszEnd; *pszEnd = 0; if ((*len = SearchPathW(NULL, pszStart, NULL, pathlen, path, NULL))) { break; } *pszEnd = c; } if (!pszEnd) { *len = SearchPathW(NULL, pszStart, NULL, pathlen, path, NULL); } } HeapFree(GetProcessHeap(), 0, pszCommand); if (!*len) { return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); } return S_OK; }
wstring search_path(const wstring& file_name) { Buffer<wchar_t> path(MAX_PATH); wchar_t* name_ptr; DWORD size = SearchPathW(nullptr, file_name.c_str(), nullptr, path.size(), path.data(), &name_ptr); if (size > path.size()) { path.resize(size); size = SearchPathW(nullptr, file_name.c_str(), nullptr, path.size(), path.data(), &name_ptr); } CHECK_SYS(size); CHECK(size < path.size()); return wstring(path.data(), size); }
bool oculusAvailable() { static std::once_flag once; static bool result { false }; std::call_once(once, [&] { static const QString DEBUG_FLAG("HIFI_DEBUG_OPENVR"); static bool enableDebugOpenVR = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG); if (enableDebugOpenVR) { return; } ovrDetectResult detect = ovr_Detect(0); if (!detect.IsOculusServiceRunning || !detect.IsOculusHMDConnected) { return; } DWORD searchResult = SearchPathW(NULL, REQUIRED_OCULUS_DLL, NULL, MAX_PATH, FOUND_PATH, NULL); if (searchResult <= 0) { return; } result = true; }); return result; }
static void res_sec_url_cmp(LPCWSTR url, DWORD size, LPCWSTR file) { WCHAR buf[MAX_PATH]; DWORD len; static const WCHAR fileW[] = {'f','i','l','e',':','/','/'}; if(size < sizeof(fileW)/sizeof(WCHAR) || memcmp(url, fileW, sizeof(fileW))) { ok(0, "wrong URL protocol\n"); return; } SetLastError(0xdeadbeef); len = SearchPathW(NULL, file, NULL, sizeof(buf)/sizeof(WCHAR), buf, NULL); if(!len) { if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) win_skip("SearchPathW is not implemented\n"); else ok(0, "SearchPath failed: %u\n", GetLastError()); return; } len += sizeof(fileW)/sizeof(WCHAR)+1; ok(len == size, "wrong size %u, expected %u\n", size, len); ok(!lstrcmpW(url + sizeof(fileW)/sizeof(WCHAR), buf), "wrong file part %s\n", wine_dbgstr_w(url)); }
int ustring_SearchPath(lua_State *L) { const wchar_t* lpPath = opt_utf8_string(L, 1, NULL); const wchar_t* lpFileName = check_utf8_string(L, 2, NULL); const wchar_t* lpExtension = opt_utf8_string(L, 3, NULL); wchar_t buf[2048]; wchar_t* lpFilePart; DWORD result = SearchPathW( lpPath, // address of search path lpFileName, // address of filename lpExtension, // address of extension sizeof(buf)/sizeof(wchar_t), // size, in characters, of buffer buf, // address of buffer for found filename &lpFilePart // address of pointer to file component ); if(result > 0) { push_utf8_string(L, buf, -1); push_utf8_string(L, lpFilePart, -1); return 2; } return 0; }
static HRESULT WINAPI MSTASK_ITask_SetApplicationName( ITask* iface, LPCWSTR pwszApplicationName) { DWORD n; TaskImpl *This = impl_from_ITask(iface); LPWSTR tmp_name; TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName)); /* Empty application name */ if (pwszApplicationName[0] == 0) { HeapFree(GetProcessHeap(), 0, This->applicationName); This->applicationName = NULL; return S_OK; } /* Attempt to set pwszApplicationName to a path resolved application name */ n = SearchPathW(NULL, pwszApplicationName, NULL, 0, NULL, NULL); if (n) { tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR)); if (!tmp_name) return E_OUTOFMEMORY; n = SearchPathW(NULL, pwszApplicationName, NULL, n, tmp_name, NULL); if (n) { HeapFree(GetProcessHeap(), 0, This->applicationName); This->applicationName = tmp_name; return S_OK; } else HeapFree(GetProcessHeap(), 0, tmp_name); } /* If unable to path resolve name, simply set to pwszApplicationName */ n = (lstrlenW(pwszApplicationName) + 1); tmp_name = HeapAlloc(GetProcessHeap(), 0, n * sizeof(WCHAR)); if (!tmp_name) return E_OUTOFMEMORY; lstrcpyW(tmp_name, pwszApplicationName); HeapFree(GetProcessHeap(), 0, This->applicationName); This->applicationName = tmp_name; return S_OK; }
wchar_t *find_on_path(wchar_t *name) { wchar_t *pathext; size_t varsize; wchar_t *context = NULL; wchar_t *extension; wchar_t *result = NULL; DWORD len; errno_t rc; /* Return value storage - we don't need to be re-entrant */ static wchar_t path_buf[MAX_PATH]; if (wcschr(name, L'.') != NULL) { /* assume it has an extension. */ len = SearchPathW(NULL, name, NULL, MAX_PATH, path_buf, NULL); if (len) { result = path_buf; } } else { /* No extension - search using registered extensions. */ rc = _wdupenv_s(&pathext, &varsize, L"PATHEXT"); if (rc == 0) { extension = wcstok_s(pathext, L";", &context); while (extension) { len = SearchPathW(NULL, name, extension, MAX_PATH, path_buf, NULL); if (len) { result = path_buf; break; } extension = wcstok_s(NULL, L";", &context); } free(pathext); } } if (result) { /* We just want the directory */ wchar_t *end = wcsrchr(result, L'\\'); *end = L'\0'; } return result; }
/****************************************************************** * FindExecutableImageExW (DBGHELP.@) * */ HANDLE WINAPI FindExecutableImageExW(PCWSTR FileName, PCWSTR SymbolPath, PWSTR ImageFilePath, PFIND_EXE_FILE_CALLBACKW Callback, PVOID user) { HANDLE h; if (Callback) FIXME("Unsupported callback yet\n"); if (!SearchPathW(SymbolPath, FileName, NULL, MAX_PATH, ImageFilePath, NULL)) return 0; h = CreateFileW(ImageFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); return (h == INVALID_HANDLE_VALUE) ? 0 : h; }
BOOL My_SearchPathW() { LPCWSTR lpPath=NULL; LPCWSTR lpFileName=NULL; LPCWSTR lpExtension=NULL; DWORD nBufferLength=NULL; LPWSTR lpBuffer=NULL; LPWSTR * lpFilePart=NULL; DWORD returnVal_Real = NULL; DWORD returnVal_Intercepted = NULL; DWORD error_Real = 0; DWORD error_Intercepted = 0; __try{ disableInterception(); returnVal_Real = SearchPathW (lpPath,lpFileName,lpExtension,nBufferLength,lpBuffer,lpFilePart); error_Real = GetLastError(); enableInterception(); returnVal_Intercepted = SearchPathW (lpPath,lpFileName,lpExtension,nBufferLength,lpBuffer,lpFilePart); error_Intercepted = GetLastError(); }__except(puts("in filter"), 1){puts("exception caught");} return ((returnVal_Real == returnVal_Intercepted) && (error_Real == error_Intercepted)); }
CAMLprim value w_create_process_native (value prog, value wprog, value wargs, value fd1, value fd2, value fd3) { int res, flags; PROCESS_INFORMATION pi; STARTUPINFOW si; wchar_t fullname [MAX_PATH]; HANDLE h; CAMLparam5(wprog, wargs, fd1, fd2, fd3); res = SearchPathW (NULL, (LPCWSTR) String_val(wprog), L".exe", MAX_PATH, fullname, NULL); if (res == 0) { win32_maperr (GetLastError ()); uerror("create_process", prog); } ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = Handle_val(fd1); si.hStdOutput = Handle_val(fd2); si.hStdError = Handle_val(fd3); flags = GetPriorityClass (GetCurrentProcess ()); /* h = CreateFile ("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) CloseHandle (h); else { flags |= CREATE_NEW_CONSOLE; // si.dwFlags |= STARTF_USESHOWWINDOW; // si.wShowWindow = SW_MINIMIZE; } */ res = CreateProcessW (fullname, (LPWSTR) String_val(wargs), NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi); if (res == 0) { win32_maperr (GetLastError ()); uerror("create_process", prog); } CloseHandle (pi.hThread); CAMLreturn (Val_long (pi.hProcess)); }
static HMMIO get_mmioFromFile(LPCWSTR lpszName) { HMMIO ret; WCHAR buf[256]; LPWSTR dummy; ret = mmioOpenW((LPWSTR)lpszName, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE); if (ret != 0) return ret; if (SearchPathW(NULL, lpszName, NULL, sizeof(buf)/sizeof(buf[0]), buf, &dummy)) { return mmioOpenW(buf, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE); } return 0; }
bool MakeNTEmacsClientCommandLine (/*[out]*/ string & program, /*[out]*/ string & arguments) { PathName pathEmacs; if (! LocateNTEmacs(pathEmacs, "gnuclientw.exe")) { wchar_t szEmacs[_MAX_PATH]; wchar_t * lpszFileName; if (! SearchPathW(0, L"gnuclientw.exe", 0, _MAX_PATH, szEmacs, &lpszFileName)) { return (false); } pathEmacs = szEmacs; } program = pathEmacs.Get(); arguments = "-F +%l \"%f\""; return (true); }
string FindFileInPath(const string &file) { string filePath; // Search the PATH directory list for the application (like shell where) to get the absolute path // Return "" if no exectuable found in the PATH list const DWORD size = 65535; char envPath[size]; if(GetEnvironmentVariableA("PATH", envPath, size) == 0) return filePath; char *next = NULL; const char *pathSeparator = ";"; const char *path = strtok_s(envPath, pathSeparator, &next); wstring fileName = StringFormat::UTF82Wide(file); while(path) { wstring testPath = StringFormat::UTF82Wide(path); // Check for the following extensions. If fileName already has one, they will be ignored. std::vector<wstring> extensions; extensions.push_back(L".exe"); extensions.push_back(L".bat"); for(uint32_t i = 0; i < extensions.size(); i++) { wchar_t foundPath[512] = {0}; if(SearchPathW(testPath.c_str(), fileName.c_str(), extensions[i].c_str(), ARRAY_COUNT(foundPath) - 1, foundPath, NULL) != 0) { filePath = StringFormat::Wide2UTF8(wstring(foundPath)); break; } } path = strtok_s(NULL, pathSeparator, &next); } return filePath; }
static void res_sec_url_cmp(LPCWSTR url, DWORD size, LPCWSTR file) { WCHAR buf[MAX_PATH]; DWORD len; static const WCHAR fileW[] = {'f','i','l','e',':','/','/'}; if(size < sizeof(fileW)/sizeof(WCHAR) || memcmp(url, fileW, sizeof(fileW))) { ok(0, "wrong URL protocol\n"); return; } len = SearchPathW(NULL, file, NULL, sizeof(buf)/sizeof(WCHAR), buf, NULL); if(!len) { ok(0, "SearchPath failed: %u\n", GetLastError()); return; } len += sizeof(fileW)/sizeof(WCHAR)+1; ok(len == size, "wrong size %u, expected %u\n", size, len); ok(!lstrcmpW(url + sizeof(fileW)/sizeof(WCHAR), buf), "wrong file part %s\n", debugstr_w(url)); }
static HRESULT ASSOC_GetExecutable(IQueryAssociationsImpl *This, LPCWSTR pszExtra, LPWSTR path, DWORD pathlen, DWORD *len) { HKEY hkeyCommand; HKEY hkeyFile; HKEY hkeyShell; HKEY hkeyVerb; HRESULT hr; LONG ret; WCHAR * pszCommand; WCHAR * pszEnd; WCHAR * pszExtraFromReg = NULL; WCHAR * pszFileType; WCHAR * pszStart; static const WCHAR commandW[] = { 'c','o','m','m','a','n','d',0 }; static const WCHAR shellW[] = { 's','h','e','l','l',0 }; assert(len); hr = ASSOC_GetValue(This->hkeySource, &pszFileType); if (FAILED(hr)) return hr; ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, pszFileType, 0, KEY_READ, &hkeyFile); HeapFree(GetProcessHeap(), 0, pszFileType); if (ret != ERROR_SUCCESS) return HRESULT_FROM_WIN32(ret); ret = RegOpenKeyExW(hkeyFile, shellW, 0, KEY_READ, &hkeyShell); RegCloseKey(hkeyFile); if (ret != ERROR_SUCCESS) return HRESULT_FROM_WIN32(ret); if (!pszExtra) { hr = ASSOC_GetValue(hkeyShell, &pszExtraFromReg); /* if no default action */ if (hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) { DWORD rlen; ret = RegQueryInfoKeyW(hkeyShell, 0, 0, 0, 0, &rlen, 0, 0, 0, 0, 0, 0); if (ret != ERROR_SUCCESS) { RegCloseKey(hkeyShell); return HRESULT_FROM_WIN32(ret); } rlen++; pszExtraFromReg = HeapAlloc(GetProcessHeap(), 0, rlen * sizeof(WCHAR)); if (!pszExtraFromReg) { RegCloseKey(hkeyShell); return E_OUTOFMEMORY; } ret = RegEnumKeyExW(hkeyShell, 0, pszExtraFromReg, &rlen, 0, NULL, NULL, NULL); if (ret != ERROR_SUCCESS) { RegCloseKey(hkeyShell); return HRESULT_FROM_WIN32(ret); } } else if (FAILED(hr)) { RegCloseKey(hkeyShell); return hr; } } ret = RegOpenKeyExW(hkeyShell, pszExtra ? pszExtra : pszExtraFromReg, 0, KEY_READ, &hkeyVerb); HeapFree(GetProcessHeap(), 0, pszExtraFromReg); RegCloseKey(hkeyShell); if (ret != ERROR_SUCCESS) return HRESULT_FROM_WIN32(ret); ret = RegOpenKeyExW(hkeyVerb, commandW, 0, KEY_READ, &hkeyCommand); RegCloseKey(hkeyVerb); if (ret != ERROR_SUCCESS) return HRESULT_FROM_WIN32(ret); hr = ASSOC_GetValue(hkeyCommand, &pszCommand); RegCloseKey(hkeyCommand); if (FAILED(hr)) return hr; /* cleanup pszCommand */ if (pszCommand[0] == '"') { pszStart = pszCommand + 1; pszEnd = strchrW(pszStart, '"'); } else { pszStart = pszCommand; pszEnd = strchrW(pszStart, ' '); } if (pszEnd) *pszEnd = 0; *len = SearchPathW(NULL, pszStart, NULL, pathlen, path, NULL); HeapFree(GetProcessHeap(), 0, pszCommand); if (!*len) return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); return S_OK; }
/************************************************************************* * ICO_ExtractIconExW [internal] * * NOTES * nIcons = 0: returns number of Icons in file * * returns * invalid file: -1 * failure:0; * success: number of icons in file (nIcons = 0) or nr of icons retrieved */ static UINT ICO_ExtractIconExW( LPCWSTR lpszExeFileName, HICON * RetPtr, INT nIconIndex, UINT nIcons, UINT cxDesired, UINT cyDesired, UINT *pIconId, UINT flags) { UINT ret = 0; UINT cx1, cx2, cy1, cy2; LPBYTE pData; DWORD sig; HANDLE hFile; UINT16 iconDirCount = 0; //,iconCount = 0; LPBYTE peimage; HANDLE fmapping; DWORD fsizeh,fsizel; WCHAR szExePath[MAX_PATH]; DWORD dwSearchReturn; TRACE("%s, %d, %d %p 0x%08x\n", debugstr_w(lpszExeFileName), nIconIndex, nIcons, pIconId, flags); dwSearchReturn = SearchPathW(NULL, lpszExeFileName, NULL, sizeof(szExePath) / sizeof(szExePath[0]), szExePath, NULL); if ((dwSearchReturn == 0) || (dwSearchReturn > sizeof(szExePath) / sizeof(szExePath[0]))) { WARN("File %s not found or path too long\n", debugstr_w(lpszExeFileName)); return -1; } hFile = CreateFileW(szExePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (hFile == INVALID_HANDLE_VALUE) return ret; fsizel = GetFileSize(hFile,&fsizeh); /* Map the file */ fmapping = CreateFileMappingW(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL); CloseHandle(hFile); if (!fmapping) { WARN("CreateFileMapping error %ld\n", GetLastError() ); return 0xFFFFFFFF; } if (!(peimage = MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0))) { WARN("MapViewOfFile error %ld\n", GetLastError() ); CloseHandle(fmapping); return 0xFFFFFFFF; } CloseHandle(fmapping); cx1 = LOWORD(cxDesired); cx2 = HIWORD(cxDesired); cy1 = LOWORD(cyDesired); cy2 = HIWORD(cyDesired); if (pIconId) /* Invalidate first icon identifier */ *pIconId = 0xFFFFFFFF; if (!pIconId) /* if no icon identifier array present use the icon handle array as intermediate storage */ pIconId = (UINT*)RetPtr; sig = USER32_GetResourceTable(peimage, fsizel, &pData); /* ico file or NE exe/dll*/ #if 0 if (sig==IMAGE_OS2_SIGNATURE || sig==1) /* .ICO file */ { BYTE *pCIDir = 0; NE_TYPEINFO *pTInfo = (NE_TYPEINFO*)(pData + 2); NE_NAMEINFO *pIconStorage = NULL; NE_NAMEINFO *pIconDir = NULL; LPicoICONDIR lpiID = NULL; TRACE("-- OS2/icon Signature (0x%08lx)\n", sig); if (pData == (BYTE*)-1) { pCIDir = ICO_GetIconDirectory(peimage, &lpiID, &uSize); /* check for .ICO file */ if (pCIDir) { iconDirCount = 1; iconCount = lpiID->idCount; TRACE("-- icon found %p 0x%08lx 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount); } } else while (pTInfo->type_id && !(pIconStorage && pIconDir)) { if (pTInfo->type_id == NE_RSCTYPE_GROUP_ICON) /* find icon directory and icon repository */ { iconDirCount = pTInfo->count; pIconDir = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\tfound directory - %i icon families\n", iconDirCount); } if (pTInfo->type_id == NE_RSCTYPE_ICON) { iconCount = pTInfo->count; pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\ttotal icons - %i\n", iconCount); } pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO)); } if ((pIconStorage && pIconDir) || lpiID) /* load resources and create icons */ { if (nIcons == 0) { ret = iconDirCount; if (lpiID && pCIDir) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); } else if (nIconIndex < iconDirCount) { UINT16 i, icon; if (nIcons > iconDirCount - nIconIndex) nIcons = iconDirCount - nIconIndex; for (i = 0; i < nIcons; i++) { /* .ICO files have only one icon directory */ if (lpiID == NULL) /* not *.ico */ pCIDir = USER32_LoadResource(peimage, pIconDir + i + nIconIndex, *(WORD*)pData, &uSize); pIconId[i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, (i & 1) ? cx2 : cx1, (i & 1) ? cy2 : cy1, flags); } if (lpiID && pCIDir) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); for (icon = 0; icon < nIcons; icon++) { pCIDir = NULL; if (lpiID) pCIDir = ICO_LoadIcon(peimage, lpiID->idEntries + (int)pIconId[icon], &uSize); else for (i = 0; i < iconCount; i++) if (pIconStorage[i].id == ((int)pIconId[icon] | 0x8000) ) pCIDir = USER32_LoadResource(peimage, pIconStorage + i, *(WORD*)pData, &uSize); if (pCIDir) RetPtr[icon] = (HICON)CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000, (icon & 1) ? cx2 : cx1, (icon & 1) ? cy2 : cy1, flags); else RetPtr[icon] = 0; } ret = icon; /* return number of retrieved icons */ } } } /* end ico file */ /* exe/dll */ else if( sig == IMAGE_NT_SIGNATURE ) #endif if( sig == IMAGE_NT_SIGNATURE ) { LPBYTE idata,igdata; PIMAGE_DOS_HEADER dheader; PIMAGE_NT_HEADERS pe_header; PIMAGE_SECTION_HEADER pe_sections; const IMAGE_RESOURCE_DIRECTORY *rootresdir,*iconresdir,*icongroupresdir; const IMAGE_RESOURCE_DATA_ENTRY *idataent,*igdataent; const IMAGE_RESOURCE_DIRECTORY_ENTRY *xresent; UINT i, j; dheader = (PIMAGE_DOS_HEADER)peimage; pe_header = (PIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew); /* it is a pe header, USER32_GetResourceTable checked that */ pe_sections = (PIMAGE_SECTION_HEADER)(((char*)pe_header) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + pe_header->FileHeader.SizeOfOptionalHeader); rootresdir = NULL; /* search for the root resource directory */ for (i=0;i<pe_header->FileHeader.NumberOfSections;i++) { if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) continue; if (fsizel < pe_sections[i].PointerToRawData+pe_sections[i].SizeOfRawData) { FIXME("File %s too short (section is at %ld bytes, real size is %ld)\n", debugstr_w(lpszExeFileName), pe_sections[i].PointerToRawData+pe_sections[i].SizeOfRawData, fsizel ); goto end; } /* FIXME: doesn't work when the resources are not in a separate section */ if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress) { rootresdir = (PIMAGE_RESOURCE_DIRECTORY)(peimage+pe_sections[i].PointerToRawData); break; } } if (!rootresdir) { WARN("haven't found section for resource directory.\n"); goto end; /* failure */ } /* search for the group icon directory */ if (!(icongroupresdir = find_entry_by_id(rootresdir, LOWORD(RT_GROUP_ICON), rootresdir))) { WARN("No Icongroupresourcedirectory!\n"); goto end; /* failure */ } iconDirCount = icongroupresdir->NumberOfNamedEntries + icongroupresdir->NumberOfIdEntries; /* only number of icons requested */ if( !pIconId ) { ret = iconDirCount; goto end; /* success */ } if( nIconIndex < 0 ) { /* search resource id */ int n = 0; int iId = abs(nIconIndex); const IMAGE_RESOURCE_DIRECTORY_ENTRY* xprdeTmp = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1); while(n<iconDirCount && xprdeTmp) { if(xprdeTmp->Id == iId) { nIconIndex = n; break; } n++; xprdeTmp++; } if (nIconIndex < 0) { WARN("resource id %d not found\n", iId); goto end; /* failure */ } } else { /* check nIconIndex to be in range */ if (nIconIndex >= iconDirCount) { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount); goto end; /* failure */ } } /* assure we don't get too much */ if( nIcons > iconDirCount - nIconIndex ) nIcons = iconDirCount - nIconIndex; /* starting from specified index */ xresent = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1) + nIconIndex; for (i=0; i < nIcons; i++,xresent++) { const IMAGE_RESOURCE_DIRECTORY *resdir; /* go down this resource entry, name */ resdir = (const IMAGE_RESOURCE_DIRECTORY*)((const char *)rootresdir+(xresent->OffsetToDirectory)); /* default language (0) */ resdir = find_entry_default(resdir,rootresdir); igdataent = (const IMAGE_RESOURCE_DATA_ENTRY*)resdir; /* lookup address in mapped image for virtual address */ igdata = NULL; for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) { if (igdataent->OffsetToData < pe_sections[j].VirtualAddress) continue; if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData) continue; if (igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData+igdataent->Size > fsizel) { FIXME("overflow in PE lookup (%s has len %ld, have offset %ld), short file?\n", debugstr_w(lpszExeFileName), fsizel, igdataent->OffsetToData - pe_sections[j].VirtualAddress + pe_sections[j].PointerToRawData + igdataent->Size); goto end; /* failure */ } igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData); } if (!igdata) { FIXME("no matching real address for icongroup!\n"); goto end; /* failure */ } pIconId[i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx1, cy1, flags); if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx2, cy2, flags); } if (!(iconresdir=find_entry_by_id(rootresdir,LOWORD(RT_ICON),rootresdir))) { WARN("No Iconresourcedirectory!\n"); goto end; /* failure */ } for (i=0; i<nIcons; i++) { const IMAGE_RESOURCE_DIRECTORY *xresdir; xresdir = find_entry_by_id(iconresdir, LOWORD(pIconId[i]), rootresdir); if (!xresdir) { WARN("icon entry %d not found\n", LOWORD(pIconId[i])); RetPtr[i]=0; continue; } xresdir = find_entry_default(xresdir, rootresdir); if (!xresdir) { WARN("icon entry %d not found\n", LOWORD(pIconId[i])); RetPtr[i]=0; continue; } idataent = (const IMAGE_RESOURCE_DATA_ENTRY*)xresdir; idata = NULL; /* map virtual to address in image */ for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) { if (idataent->OffsetToData < pe_sections[j].VirtualAddress) continue; if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData) continue; idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData); } if (!idata) { WARN("no matching real address found for icondata!\n"); RetPtr[i]=0; continue; } RetPtr[i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx1, cy1, flags); if (cx2 && cy2) RetPtr[++i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx2, cy2, flags); } ret = i; /* return number of retrieved icons */ } /* if(sig == IMAGE_NT_SIGNATURE) */ end: UnmapViewOfFile(peimage); /* success */ return ret; }
int __cdecl main(int argc, char *argv[]) { WCHAR* lpPath = NULL; WCHAR* lpFileName = NULL; WCHAR* lpExtension = NULL; DWORD nBufferLength = 0; WCHAR lpBuffer[_MAX_PATH]; WCHAR** lpFilePart = NULL; DWORD error = 0; DWORD result = 0; HANDLE hsearchfile; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; char fullPath[_MAX_DIR]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; if(0 != (PAL_Initialize(argc, argv))) { return FAIL; } /* Initalize the buffer. */ memset(fullPath, 0, _MAX_DIR); if (GetTempPathA(_MAX_DIR, fullPath) == 0) { Fail("ERROR: GetTempPathA failed to get a path\n"); } memset(fileloc, 0, _MAX_PATH); sprintf_s(fileloc, _countof(fileloc), "%s%s", fullPath, szFileNameExistsWithExt); RemoveAll(); hsearchfile = CreateFileA(fileloc, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hsearchfile == NULL) { Trace("ERROR[%ul]: couldn't create %s\n", GetLastError(), fileloc); return FAIL; } CloseHandle(hsearchfile); // // find a file that doesn't exist // ZeroMemory( lpBuffer, sizeof(lpBuffer)); lpPath = convert((LPSTR)fullPath); lpFileName = convert((LPSTR)szNoFileName); lpExtension = NULL; if( SearchPathW( lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, lpFilePart) != 0 ){ error = GetLastError(); free(lpPath); free(lpFileName); Fail ("SearchPathW: ERROR1 -> Found invalid file[%s][%s][%s][%d]\n", lpPath, szNoFileName, szNoFileNameExt, error); } free(lpPath); free(lpFileName); // // find a file that exists, when path is mentioned explicitly // ZeroMemory( lpBuffer, sizeof(lpBuffer)); lpPath = convert((LPSTR)fullPath); lpFileName = convert((LPSTR)szFileNameExistsWithExt); lpExtension = NULL; result = SearchPathW( lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, lpFilePart); if( result == 0 ){ error = GetLastError(); free(lpPath); free(lpFileName); Fail ("SearchPathA: ERROR2 -> Did not Find valid file[%s][%s][%d]\n", lpPath, szFileNameExistsWithExt, error); } free(lpPath); free(lpFileName); RemoveAll(); PAL_Terminate(); return PASS; }
static NTSTATUS BasepLoadLibraryAsDatafile(PWSTR Path, LPCWSTR Name, HMODULE *hModule) { WCHAR FilenameW[MAX_PATH]; HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMapping; NTSTATUS Status; PVOID lpBaseAddress = NULL; SIZE_T ViewSize = 0; //PUNICODE_STRING OriginalName; //UNICODE_STRING dotDLL = RTL_CONSTANT_STRING(L".DLL"); /* Zero out handle value */ *hModule = 0; DPRINT("BasepLoadLibraryAsDatafile(%S %S %p)\n", Path, Name, hModule); /*Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE, Name, &dotDLL, RedirName, RedirName2, &OriginalName2, NULL, NULL, NULL);*/ /* Try to search for it */ if (!SearchPathW(Path, Name, L".DLL", sizeof(FilenameW) / sizeof(FilenameW[0]), FilenameW, NULL)) { /* Return last status value directly */ return NtCurrentTeb()->LastStatusValue; } /* Open this file we found */ hFile = CreateFileW(FilenameW, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0); /* If opening failed - return last status value */ if (hFile == INVALID_HANDLE_VALUE) return NtCurrentTeb()->LastStatusValue; /* Create file mapping */ hMapping = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); /* Close the file handle */ CloseHandle(hFile); /* If creating file mapping failed - return last status value */ if (!hMapping) return NtCurrentTeb()->LastStatusValue; /* Map view of section */ Status = NtMapViewOfSection(hMapping, NtCurrentProcess(), &lpBaseAddress, 0, 0, 0, &ViewSize, ViewShare, 0, PAGE_READONLY); /* Close handle to the section */ CloseHandle(hMapping); /* If mapping view of section failed - return last status value */ if (!NT_SUCCESS(Status)) return NtCurrentTeb()->LastStatusValue; /* Make sure it's a valid PE file */ if (!RtlImageNtHeader(lpBaseAddress)) { /* Unmap the view and return failure status */ UnmapViewOfFile(lpBaseAddress); return STATUS_INVALID_IMAGE_FORMAT; } /* Set low bit of handle to indicate datafile module */ *hModule = (HMODULE)((ULONG_PTR)lpBaseAddress | 1); /* Load alternate resource module */ //LdrLoadAlternateResourceModule(*hModule, FilenameW); return STATUS_SUCCESS; }
static HRESULT WINAPI ResProtocolInfo_ParseUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD* pcchResult, DWORD dwReserved) { TRACE("%p)->(%s %d %x %p %d %p %d)\n", iface, debugstr_w(pwzUrl), ParseAction, dwParseFlags, pwzResult, cchResult, pcchResult, dwReserved); if(ParseAction == PARSE_SECURITY_URL) { WCHAR file_part[MAX_PATH], full_path[MAX_PATH]; WCHAR *ptr; DWORD size, len; static const WCHAR wszFile[] = {'f','i','l','e',':','/','/'}; static const WCHAR wszRes[] = {'r','e','s',':','/','/'}; if(strlenW(pwzUrl) <= sizeof(wszRes)/sizeof(WCHAR) || memcmp(pwzUrl, wszRes, sizeof(wszRes))) return E_INVALIDARG; ptr = strchrW(pwzUrl + sizeof(wszRes)/sizeof(WCHAR), '/'); if(!ptr) return E_INVALIDARG; len = ptr - (pwzUrl + sizeof(wszRes)/sizeof(WCHAR)); if(len >= sizeof(file_part)/sizeof(WCHAR)) { FIXME("Too long URL\n"); return MK_E_SYNTAX; } memcpy(file_part, pwzUrl + sizeof(wszRes)/sizeof(WCHAR), len*sizeof(WCHAR)); file_part[len] = 0; len = SearchPathW(NULL, file_part, NULL, sizeof(full_path)/sizeof(WCHAR), full_path, NULL); if(!len) { WARN("Could not find file %s\n", debugstr_w(file_part)); return MK_E_SYNTAX; } size = sizeof(wszFile)/sizeof(WCHAR) + len + 1; if(pcchResult) *pcchResult = size; if(size >= cchResult) return S_FALSE; memcpy(pwzResult, wszFile, sizeof(wszFile)); memcpy(pwzResult + sizeof(wszFile)/sizeof(WCHAR), full_path, (len+1)*sizeof(WCHAR)); return S_OK; } if(ParseAction == PARSE_DOMAIN) { if(!pcchResult) return E_POINTER; if(pwzUrl) *pcchResult = strlenW(pwzUrl)+1; else *pcchResult = 1; return E_FAIL; } return INET_E_DEFAULT_ACTION; }
/************************************************************************* * ICO_ExtractIconExW [internal] * * NOTES * nIcons = 0: returns number of Icons in file * * returns * invalid file: -1 * failure:0; * success: number of icons in file (nIcons = 0) or nr of icons retrieved */ static UINT ICO_ExtractIconExW( LPCWSTR lpszExeFileName, HICON * RetPtr, INT nIconIndex, UINT nIcons, UINT cxDesired, UINT cyDesired, UINT *pIconId, UINT flags) { UINT ret = 0; UINT cx1, cx2, cy1, cy2; LPBYTE pData; DWORD sig; HANDLE hFile; UINT16 iconDirCount = 0, iconCount = 0; LPBYTE peimage; HANDLE fmapping; DWORD fsizeh,fsizel; WCHAR szExePath[MAX_PATH]; DWORD dwSearchReturn; TRACE("%s, %d, %d %p 0x%08x\n", debugstr_w(lpszExeFileName), nIconIndex, nIcons, pIconId, flags); dwSearchReturn = SearchPathW(NULL, lpszExeFileName, NULL, sizeof(szExePath) / sizeof(szExePath[0]), szExePath, NULL); if ((dwSearchReturn == 0) || (dwSearchReturn > sizeof(szExePath) / sizeof(szExePath[0]))) { WARN("File %s not found or path too long\n", debugstr_w(lpszExeFileName)); return -1; } hFile = CreateFileW(szExePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (hFile == INVALID_HANDLE_VALUE) return ret; fsizel = GetFileSize(hFile,&fsizeh); /* Map the file */ fmapping = CreateFileMappingW(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL); CloseHandle(hFile); if (!fmapping) { WARN("CreateFileMapping error %ld\n", GetLastError() ); return 0xFFFFFFFF; } if (!(peimage = MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0))) { WARN("MapViewOfFile error %ld\n", GetLastError() ); CloseHandle(fmapping); return 0xFFFFFFFF; } CloseHandle(fmapping); cx1 = LOWORD(cxDesired); cx2 = HIWORD(cxDesired); cy1 = LOWORD(cyDesired); cy2 = HIWORD(cyDesired); if (pIconId) /* Invalidate first icon identifier */ *pIconId = 0xFFFFFFFF; if (!pIconId) /* if no icon identifier array present use the icon handle array as intermediate storage */ pIconId = (UINT*)RetPtr; sig = USER32_GetResourceTable(peimage, fsizel, &pData); #ifdef WINE /* ico file or NE exe/dll*/ if (sig==IMAGE_OS2_SIGNATURE || sig==1) /* .ICO file */ { BYTE *pCIDir = 0; NE_TYPEINFO *pTInfo = (NE_TYPEINFO*)(pData + 2); NE_NAMEINFO *pIconStorage = NULL; NE_NAMEINFO *pIconDir = NULL; LPicoICONDIR lpiID = NULL; ULONG uSize = 0; TRACE("-- OS2/icon Signature (0x%08x)\n", sig); if (pData == (BYTE*)-1) { pCIDir = ICO_GetIconDirectory(peimage, &lpiID, &uSize); /* check for .ICO file */ if (pCIDir) { iconDirCount = 1; iconCount = lpiID->idCount; TRACE("-- icon found %p 0x%08x 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount); } } else while (pTInfo->type_id && !(pIconStorage && pIconDir)) { if (pTInfo->type_id == NE_RSCTYPE_GROUP_ICON) /* find icon directory and icon repository */ { iconDirCount = pTInfo->count; pIconDir = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\tfound directory - %i icon families\n", iconDirCount); } if (pTInfo->type_id == NE_RSCTYPE_ICON) { iconCount = pTInfo->count; pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\ttotal icons - %i\n", iconCount); } pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO)); } if ((pIconStorage && pIconDir) || lpiID) /* load resources and create icons */ { if (nIcons == 0) { ret = iconDirCount; if (lpiID) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); } else if (nIconIndex < iconDirCount) { UINT16 i, icon; if (nIcons > iconDirCount - nIconIndex) nIcons = iconDirCount - nIconIndex; for (i = 0; i < nIcons; i++) { /* .ICO files have only one icon directory */ if (lpiID == NULL) /* not *.ico */ pCIDir = USER32_LoadResource(peimage, pIconDir + i + nIconIndex, *(WORD*)pData, &uSize); pIconId[i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, cx1, cy1, flags); if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, cx2, cy2, flags); } if (lpiID) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); for (icon = 0; icon < nIcons; icon++) { pCIDir = NULL; if (lpiID) pCIDir = ICO_LoadIcon(peimage, lpiID->idEntries + (int)pIconId[icon], &uSize); else for (i = 0; i < iconCount; i++) if (pIconStorage[i].id == ((int)pIconId[icon] | 0x8000) ) pCIDir = USER32_LoadResource(peimage, pIconStorage + i, *(WORD*)pData, &uSize); if (pCIDir) { RetPtr[icon] = CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000, cx1, cy1, flags); if (cx2 && cy2) RetPtr[++icon] = CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000, cx2, cy2, flags); } else RetPtr[icon] = 0; } ret = icon; /* return number of retrieved icons */ } } } #else if (sig == 1 || sig == 2) /* .ICO or .CUR file */ { TRACE("-- icon Signature (0x%08x)\n", sig); if (pData == (BYTE*)-1) { INT cx[2] = {cx1, cx2}, cy[2] = {cy1, cy2}; INT index; for(index = 0; index < 2; index++) { DWORD dataOffset; LPBYTE imageData; POINT hotSpot; LPICONIMAGE entry; dataOffset = get_best_icon_file_offset(peimage, fsizel, cx[index], cy[index], sig == 1, flags, sig == 1 ? NULL : &hotSpot); if (dataOffset) { HICON icon; WORD *cursorData = NULL; imageData = peimage + dataOffset; entry = (LPICONIMAGE)(imageData); if(sig == 2) { /* we need to prepend the bitmap data with hot spots for CreateIconFromResourceEx */ cursorData = HeapAlloc(GetProcessHeap(), 0, entry->icHeader.biSizeImage + 2 * sizeof(WORD)); if(!cursorData) continue; cursorData[0] = hotSpot.x; cursorData[1] = hotSpot.y; memcpy(cursorData + 2, imageData, entry->icHeader.biSizeImage); imageData = (LPBYTE)cursorData; } icon = CreateIconFromResourceEx(imageData, entry->icHeader.biSizeImage, sig == 1, 0x00030000, cx[index], cy[index], flags); if (icon) { RetPtr[index] = icon; iconCount = 1; } if(cursorData != NULL) HeapFree(GetProcessHeap(), 0, cursorData); } } } ret = iconCount; /* return number of retrieved icons */ } #endif /* end ico file */ /* exe/dll */ else if( sig == IMAGE_NT_SIGNATURE ) { BYTE *idata, *igdata; const IMAGE_RESOURCE_DIRECTORY *rootresdir, *iconresdir, *icongroupresdir; const IMAGE_RESOURCE_DATA_ENTRY *idataent, *igdataent; const IMAGE_RESOURCE_DIRECTORY_ENTRY *xresent; ULONG size; UINT i; rootresdir = RtlImageDirectoryEntryToData((HMODULE)peimage, FALSE, IMAGE_DIRECTORY_ENTRY_RESOURCE, &size); if (!rootresdir) { WARN("haven't found section for resource directory.\n"); goto end; } /* search for the group icon directory */ if (!(icongroupresdir = find_entry_by_id(rootresdir, LOWORD(RT_GROUP_ICON), rootresdir))) { WARN("No Icongroupresourcedirectory!\n"); goto end; /* failure */ } iconDirCount = icongroupresdir->NumberOfNamedEntries + icongroupresdir->NumberOfIdEntries; /* only number of icons requested */ if( !pIconId ) { ret = iconDirCount; goto end; /* success */ } if( nIconIndex < 0 ) { /* search resource id */ int n = 0; int iId = abs(nIconIndex); const IMAGE_RESOURCE_DIRECTORY_ENTRY* xprdeTmp = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1); while(n<iconDirCount && xprdeTmp) { if(xprdeTmp->Id == iId) { nIconIndex = n; break; } n++; xprdeTmp++; } if (nIconIndex < 0) { WARN("resource id %d not found\n", iId); goto end; /* failure */ } } else { /* check nIconIndex to be in range */ if (nIconIndex >= iconDirCount) { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount); goto end; /* failure */ } } /* assure we don't get too much */ if( nIcons > iconDirCount - nIconIndex ) nIcons = iconDirCount - nIconIndex; /* starting from specified index */ xresent = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1) + nIconIndex; for (i=0; i < nIcons; i++,xresent++) { const IMAGE_RESOURCE_DIRECTORY *resdir; /* go down this resource entry, name */ resdir = (const IMAGE_RESOURCE_DIRECTORY *)((const char *)rootresdir + xresent->OffsetToDirectory); /* default language (0) */ resdir = find_entry_default(resdir,rootresdir); igdataent = (const IMAGE_RESOURCE_DATA_ENTRY*)resdir; /* lookup address in mapped image for virtual address */ igdata = RtlImageRvaToVa(RtlImageNtHeader((HMODULE)peimage), (HMODULE)peimage, igdataent->OffsetToData, NULL); if (!igdata) { FIXME("no matching real address for icongroup!\n"); goto end; /* failure */ } pIconId[i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx1, cy1, flags); if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx2, cy2, flags); } if (!(iconresdir=find_entry_by_id(rootresdir,LOWORD(RT_ICON),rootresdir))) { WARN("No Iconresourcedirectory!\n"); goto end; /* failure */ } for (i=0; i<nIcons; i++) { const IMAGE_RESOURCE_DIRECTORY *xresdir; xresdir = find_entry_by_id(iconresdir, LOWORD(pIconId[i]), rootresdir); if( !xresdir ) { WARN("icon entry %d not found\n", LOWORD(pIconId[i])); RetPtr[i]=0; continue; } xresdir = find_entry_default(xresdir, rootresdir); idataent = (const IMAGE_RESOURCE_DATA_ENTRY*)xresdir; idata = RtlImageRvaToVa(RtlImageNtHeader((HMODULE)peimage), (HMODULE)peimage, idataent->OffsetToData, NULL); if (!idata) { WARN("no matching real address found for icondata!\n"); RetPtr[i]=0; continue; } RetPtr[i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx1, cy1, flags); if (cx2 && cy2) RetPtr[++i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx2, cy2, flags); } ret = i; /* return number of retrieved icons */ } /* if(sig == IMAGE_NT_SIGNATURE) */ end: UnmapViewOfFile(peimage); /* success */ return ret; }
LPCWSTR GetComspecFromEnvVar(wchar_t* pszComspec, DWORD cchMax, ComSpecBits Bits/* = csb_SameOS*/) { if (!pszComspec || (cchMax < MAX_PATH)) { _ASSERTE(pszComspec && (cchMax >= MAX_PATH)); return NULL; } *pszComspec = 0; BOOL bWin64 = IsWindows64(); if (!((Bits == csb_x32) || (Bits == csb_x64))) { if (GetEnvironmentVariable(L"ComSpec", pszComspec, cchMax)) { // Не должен быть (даже случайно) ConEmuC.exe const wchar_t* pszName = PointToName(pszComspec); if (!pszName || !lstrcmpi(pszName, L"ConEmuC.exe") || !lstrcmpi(pszName, L"ConEmuC64.exe") || !FileExists(pszComspec)) // ну и существовать должен { pszComspec[0] = 0; } } } // Если не удалось определить через переменную окружения - пробуем обычный "cmd.exe" из System32 if (pszComspec[0] == 0) { int n = GetWindowsDirectory(pszComspec, cchMax - 20); if (n > 0 && (((DWORD)n) < (cchMax - 20))) { // Добавить \System32\cmd.exe // Warning! 'c:\Windows\SysNative\cmd.exe' не прокатит, т.к. доступен // только для 32битных приложений. А нам нужно в общем виде. // Если из 32битного нужно запустить 64битный cmd.exe - нужно выключать редиректор. if (!bWin64 || (Bits != csb_x32)) { _wcscat_c(pszComspec, cchMax, (pszComspec[n-1] == L'\\') ? L"System32\\cmd.exe" : L"\\System32\\cmd.exe"); } else { _wcscat_c(pszComspec, cchMax, (pszComspec[n-1] == L'\\') ? L"SysWOW64\\cmd.exe" : L"\\SysWOW64\\cmd.exe"); } } } if (pszComspec[0] && !FileExists(pszComspec)) { _ASSERTE("Comspec not found! File not exists!"); pszComspec[0] = 0; } // Last chance if (pszComspec[0] == 0) { _ASSERTE(pszComspec[0] != 0); // Уже должен был быть определен //lstrcpyn(pszComspec, L"cmd.exe", cchMax); wchar_t *psFilePart; DWORD n = SearchPathW(NULL, L"cmd.exe", NULL, cchMax, pszComspec, &psFilePart); if (!n || (n >= cchMax)) _wcscpy_c(pszComspec, cchMax, L"cmd.exe"); } return pszComspec; }
static HRESULT WINAPI ResProtocolInfo_ParseUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD* pcchResult, DWORD dwReserved) { TRACE("%p)->(%s %d %x %p %d %p %d)\n", iface, debugstr_w(pwzUrl), ParseAction, dwParseFlags, pwzResult, cchResult, pcchResult, dwReserved); if(ParseAction == PARSE_SECURITY_URL) { WCHAR file_part[MAX_PATH], full_path[MAX_PATH]; WCHAR *ptr; DWORD size, len; static const WCHAR wszFile[] = {'f','i','l','e',':','/','/'}; static const WCHAR wszRes[] = {'r','e','s',':','/','/'}; if(strlenW(pwzUrl) <= sizeof(wszRes)/sizeof(WCHAR) || memcmp(pwzUrl, wszRes, sizeof(wszRes))) return E_INVALIDARG; ptr = strchrW(pwzUrl + sizeof(wszRes)/sizeof(WCHAR), '/'); if(!ptr) return E_INVALIDARG; len = ptr - (pwzUrl + sizeof(wszRes)/sizeof(WCHAR)); if(len >= sizeof(file_part)/sizeof(WCHAR)) { FIXME("Too long URL\n"); return MK_E_SYNTAX; } memcpy(file_part, pwzUrl + sizeof(wszRes)/sizeof(WCHAR), len*sizeof(WCHAR)); file_part[len] = 0; len = SearchPathW(NULL, file_part, NULL, sizeof(full_path)/sizeof(WCHAR), full_path, NULL); if(!len) { HMODULE module; /* SearchPath does not work well with winelib files (like our test executable), * so we also try to load the library here */ module = LoadLibraryExW(file_part, NULL, LOAD_LIBRARY_AS_DATAFILE); if(!module) { WARN("Could not find file %s\n", debugstr_w(file_part)); return MK_E_SYNTAX; } len = GetModuleFileNameW(module, full_path, sizeof(full_path)/sizeof(WCHAR)); FreeLibrary(module); if(!len) return E_FAIL; } size = sizeof(wszFile)/sizeof(WCHAR) + len + 1; if(pcchResult) *pcchResult = size; if(size > cchResult) return S_FALSE; memcpy(pwzResult, wszFile, sizeof(wszFile)); memcpy(pwzResult + sizeof(wszFile)/sizeof(WCHAR), full_path, (len+1)*sizeof(WCHAR)); return S_OK; } if(ParseAction == PARSE_DOMAIN) { if(!pcchResult) return E_POINTER; if(pwzUrl) *pcchResult = strlenW(pwzUrl)+1; else *pcchResult = 1; return E_FAIL; } return INET_E_DEFAULT_ACTION; }
/**************************************************************************** * WCMD_HandleTildaModifiers * * Handle the ~ modifiers when expanding %0-9 or (%a-z/A-Z in for command) * %~xxxxxV (V=0-9 or A-Z, a-z) * Where xxxx is any combination of: * ~ - Removes quotes * f - Fully qualified path (assumes current dir if not drive\dir) * d - drive letter * p - path * n - filename * x - file extension * s - path with shortnames * a - attributes * t - date/time * z - size * $ENVVAR: - Searches ENVVAR for (contents of V) and expands to fully * qualified path * * To work out the length of the modifier: * * Note: In the case of %0-9 knowing the end of the modifier is easy, * but in a for loop, the for end WCHARacter may also be a modifier * eg. for %a in (c:\a.a) do echo XXX * where XXX = %~a (just ~) * %~aa (~ and attributes) * %~aaxa (~, attributes and extension) * BUT %~aax (~ and attributes followed by 'x') * * Hence search forwards until find an invalid modifier, and then * backwards until find for variable or 0-9 */ void WCMD_HandleTildaModifiers(WCHAR **start, BOOL atExecute) { #define NUMMODIFIERS 11 static const WCHAR validmodifiers[NUMMODIFIERS] = { '~', 'f', 'd', 'p', 'n', 'x', 's', 'a', 't', 'z', '$' }; WIN32_FILE_ATTRIBUTE_DATA fileInfo; WCHAR outputparam[MAX_PATH]; WCHAR finaloutput[MAX_PATH]; WCHAR fullfilename[MAX_PATH]; WCHAR thisoutput[MAX_PATH]; WCHAR *pos = *start+1; WCHAR *firstModifier = pos; WCHAR *lastModifier = NULL; int modifierLen = 0; BOOL finished = FALSE; int i = 0; BOOL exists = TRUE; BOOL skipFileParsing = FALSE; BOOL doneModifier = FALSE; /* Search forwards until find invalid character modifier */ while (!finished) { /* Work on the previous character */ if (lastModifier != NULL) { for (i=0; i<NUMMODIFIERS; i++) { if (validmodifiers[i] == *lastModifier) { /* Special case '$' to skip until : found */ if (*lastModifier == '$') { while (*pos != ':' && *pos) pos++; if (*pos == 0x00) return; /* Invalid syntax */ pos++; /* Skip ':' */ } break; } } if (i==NUMMODIFIERS) { finished = TRUE; } } /* Save this one away */ if (!finished) { lastModifier = pos; pos++; } } while (lastModifier > firstModifier) { WINE_TRACE("Looking backwards for parameter id: %s\n", wine_dbgstr_w(lastModifier)); if (!atExecute && context && (*lastModifier >= '0' && *lastModifier <= '9')) { /* Its a valid parameter identifier - OK */ break; } else { int foridx = FOR_VAR_IDX(*lastModifier); /* Its a valid parameter identifier - OK */ if ((foridx >= 0) && (forloopcontext.variable[foridx] != NULL)) break; /* Its not a valid parameter identifier - step backwards */ lastModifier--; } } if (lastModifier == firstModifier) return; /* Invalid syntax */ /* Extract the parameter to play with */ if (*lastModifier == '0') { strcpyW(outputparam, context->batchfileW); } else if ((*lastModifier >= '1' && *lastModifier <= '9')) { strcpyW(outputparam, WCMD_parameter (context -> command, *lastModifier-'0' + context -> shift_count[*lastModifier-'0'], NULL, FALSE, TRUE)); } else { int foridx = FOR_VAR_IDX(*lastModifier); strcpyW(outputparam, forloopcontext.variable[foridx]); } /* So now, firstModifier points to beginning of modifiers, lastModifier points to the variable just after the modifiers. Process modifiers in a specific order, remembering there could be duplicates */ modifierLen = lastModifier - firstModifier; finaloutput[0] = 0x00; /* 1. Handle '~' : Strip surrounding quotes */ if (outputparam[0]=='"' && memchrW(firstModifier, '~', modifierLen) != NULL) { int len = strlenW(outputparam); if (outputparam[len-1] == '"') { outputparam[len-1]=0x00; len = len - 1; } memmove(outputparam, &outputparam[1], (len * sizeof(WCHAR))-1); } /* 2. Handle the special case of a $ */ if (memchrW(firstModifier, '$', modifierLen) != NULL) { /* Special Case: Search envar specified in $[envvar] for outputparam Note both $ and : are guaranteed otherwise check above would fail */ WCHAR *begin = strchrW(firstModifier, '$') + 1; WCHAR *end = strchrW(firstModifier, ':'); WCHAR env[MAX_PATH]; DWORD size; /* Extract the env var */ memcpy(env, begin, (end-begin) * sizeof(WCHAR)); env[(end-begin)] = 0x00; size = GetEnvironmentVariableW(env, NULL, 0); if (size > 0) { WCHAR *fullpath = heap_alloc(size * sizeof(WCHAR)); if (!fullpath || (GetEnvironmentVariableW(env, fullpath, size) == 0) || (SearchPathW(fullpath, outputparam, NULL, MAX_PATH, outputparam, NULL) == 0)) size = 0; heap_free(fullpath); } if (!size) { /* If env var not found, return empty string */ finaloutput[0] = 0x00; outputparam[0] = 0x00; skipFileParsing = TRUE; } } /* After this, we need full information on the file, which is valid not to exist. */ if (!skipFileParsing) { if (GetFullPathNameW(outputparam, MAX_PATH, fullfilename, NULL) == 0) { exists = FALSE; fullfilename[0] = 0x00; } else { exists = GetFileAttributesExW(fullfilename, GetFileExInfoStandard, &fileInfo); } /* 2. Handle 'a' : Output attributes (File doesn't have to exist) */ if (memchrW(firstModifier, 'a', modifierLen) != NULL) { WCHAR defaults[] = {'-','-','-','-','-','-','-','-','-','\0'}; doneModifier = TRUE; if (exists) { strcpyW(thisoutput, defaults); if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) thisoutput[0]='d'; if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) thisoutput[1]='r'; if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) thisoutput[2]='a'; if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) thisoutput[3]='h'; if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) thisoutput[4]='s'; if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) thisoutput[5]='c'; /* FIXME: What are 6 and 7? */ if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) thisoutput[8]='l'; strcatW(finaloutput, thisoutput); } } /* 3. Handle 't' : Date+time (File doesn't have to exist) */ if (memchrW(firstModifier, 't', modifierLen) != NULL) { SYSTEMTIME systime; int datelen; doneModifier = TRUE; if (exists) { if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW); /* Format the time */ FileTimeToSystemTime(&fileInfo.ftLastWriteTime, &systime); GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &systime, NULL, thisoutput, MAX_PATH); strcatW(thisoutput, spaceW); datelen = strlenW(thisoutput); GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &systime, NULL, (thisoutput+datelen), MAX_PATH-datelen); strcatW(finaloutput, thisoutput); } } /* 4. Handle 'z' : File length (File doesn't have to exist) */ if (memchrW(firstModifier, 'z', modifierLen) != NULL) { /* FIXME: Output full 64 bit size (sprintf does not support I64 here) */ ULONG/*64*/ fullsize = /*(fileInfo.nFileSizeHigh << 32) +*/ fileInfo.nFileSizeLow; static const WCHAR fmt[] = {'%','u','\0'}; doneModifier = TRUE; if (exists) { if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW); wsprintfW(thisoutput, fmt, fullsize); strcatW(finaloutput, thisoutput); } } /* 4. Handle 's' : Use short paths (File doesn't have to exist) */ if (memchrW(firstModifier, 's', modifierLen) != NULL) { if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW); /* Don't flag as doneModifier - %~s on its own is processed later */ GetShortPathNameW(outputparam, outputparam, sizeof(outputparam)/sizeof(outputparam[0])); } /* 5. Handle 'f' : Fully qualified path (File doesn't have to exist) */ /* Note this overrides d,p,n,x */ if (memchrW(firstModifier, 'f', modifierLen) != NULL) { doneModifier = TRUE; if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW); strcatW(finaloutput, fullfilename); } else { WCHAR drive[10]; WCHAR dir[MAX_PATH]; WCHAR fname[MAX_PATH]; WCHAR ext[MAX_PATH]; BOOL doneFileModifier = FALSE; BOOL addSpace = (finaloutput[0] != 0x00); /* Split into components */ WCMD_splitpath(fullfilename, drive, dir, fname, ext); /* 5. Handle 'd' : Drive Letter */ if (memchrW(firstModifier, 'd', modifierLen) != NULL) { if (addSpace) { strcatW(finaloutput, spaceW); addSpace = FALSE; } strcatW(finaloutput, drive); doneModifier = TRUE; doneFileModifier = TRUE; } /* 6. Handle 'p' : Path */ if (memchrW(firstModifier, 'p', modifierLen) != NULL) { if (addSpace) { strcatW(finaloutput, spaceW); addSpace = FALSE; } strcatW(finaloutput, dir); doneModifier = TRUE; doneFileModifier = TRUE; } /* 7. Handle 'n' : Name */ if (memchrW(firstModifier, 'n', modifierLen) != NULL) { if (addSpace) { strcatW(finaloutput, spaceW); addSpace = FALSE; } strcatW(finaloutput, fname); doneModifier = TRUE; doneFileModifier = TRUE; } /* 8. Handle 'x' : Ext */ if (memchrW(firstModifier, 'x', modifierLen) != NULL) { if (addSpace) { strcatW(finaloutput, spaceW); addSpace = FALSE; } strcatW(finaloutput, ext); doneModifier = TRUE; doneFileModifier = TRUE; } /* If 's' but no other parameter, dump the whole thing */ if (!doneFileModifier && memchrW(firstModifier, 's', modifierLen) != NULL) { doneModifier = TRUE; if (finaloutput[0] != 0x00) strcatW(finaloutput, spaceW); strcatW(finaloutput, outputparam); } } } /* If No other modifier processed, just add in parameter */ if (!doneModifier) strcpyW(finaloutput, outputparam); /* Finish by inserting the replacement into the string */ WCMD_strsubstW(*start, lastModifier+1, finaloutput, -1); }
static NTSTATUS NTAPI patched_LdrLoadDll (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileName, PHANDLE handle) { // We have UCS2 (UTF16?), we want ASCII, but we also just want the filename portion #define DLLNAME_MAX 128 char dllName[DLLNAME_MAX+1]; wchar_t *dll_part; DllBlockInfo *info; int len = moduleFileName->Length / 2; wchar_t *fname = moduleFileName->Buffer; // The filename isn't guaranteed to be null terminated, but in practice // it always will be; ensure that this is so, and bail if not. // This is done instead of the more robust approach because of bug 527122, // where lots of weird things were happening when we tried to make a copy. if (moduleFileName->MaximumLength < moduleFileName->Length+2 || fname[len] != 0) { #ifdef DEBUG printf_stderr("LdrLoadDll: non-null terminated string found!\n"); #endif goto continue_loading; } dll_part = wcsrchr(fname, L'\\'); if (dll_part) { dll_part = dll_part + 1; len -= dll_part - fname; } else { dll_part = fname; } #ifdef DEBUG_very_verbose printf_stderr("LdrLoadDll: dll_part '%S' %d\n", dll_part, len); #endif // if it's too long, then, we assume we won't want to block it, // since DLLNAME_MAX should be at least long enough to hold the longest // entry in our blocklist. if (len > DLLNAME_MAX) { #ifdef DEBUG printf_stderr("LdrLoadDll: len too long! %d\n", len); #endif goto continue_loading; } // copy over to our char byte buffer, lowercasing ASCII as we go for (int i = 0; i < len; i++) { wchar_t c = dll_part[i]; if (c > 0x7f) { // welp, it's not ascii; if we need to add non-ascii things to // our blocklist, we'll have to remove this limitation. goto continue_loading; } // ensure that dll name is all lowercase if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; dllName[i] = (char) c; } dllName[len] = 0; #ifdef DEBUG_very_verbose printf_stderr("LdrLoadDll: dll name '%s'\n", dllName); #endif // then compare to everything on the blocklist info = &sWindowsDllBlocklist[0]; while (info->name) { if (strcmp(info->name, dllName) == 0) break; info++; } if (info->name) { bool load_ok = false; #ifdef DEBUG_very_verbose printf_stderr("LdrLoadDll: info->name: '%s'\n", info->name); #endif if (info->maxVersion != ALL_VERSIONS) { // figure out the length of the string that we need DWORD pathlen = SearchPathW(filePath, fname, L".dll", 0, NULL, NULL); if (pathlen == 0) { // uh, we couldn't find the DLL at all, so... printf_stderr("LdrLoadDll: Blocking load of '%s' (SearchPathW didn't find it?)\n", dllName); return STATUS_DLL_NOT_FOUND; } wchar_t *full_fname = (wchar_t*) malloc(sizeof(wchar_t)*(pathlen+1)); if (!full_fname) { // couldn't allocate memory? return STATUS_DLL_NOT_FOUND; } // now actually grab it SearchPathW(filePath, fname, L".dll", pathlen+1, full_fname, NULL); DWORD zero; DWORD infoSize = GetFileVersionInfoSizeW(full_fname, &zero); // If we failed to get the version information, we block. if (infoSize != 0) { nsAutoArrayPtr<unsigned char> infoData(new unsigned char[infoSize]); VS_FIXEDFILEINFO *vInfo; UINT vInfoLen; if (GetFileVersionInfoW(full_fname, 0, infoSize, infoData) && VerQueryValueW(infoData, L"\\", (LPVOID*) &vInfo, &vInfoLen)) { unsigned long long fVersion = ((unsigned long long)vInfo->dwFileVersionMS) << 32 | ((unsigned long long)vInfo->dwFileVersionLS); // finally do the version check, and if it's greater than our block // version, keep loading if (fVersion > info->maxVersion) load_ok = true; } } free(full_fname); } if (!load_ok) { printf_stderr("LdrLoadDll: Blocking load of '%s' -- see http://www.mozilla.com/en-US/blocklist/\n", dllName); return STATUS_DLL_NOT_FOUND; } } continue_loading: #ifdef DEBUG_very_verbose printf_stderr("LdrLoadDll: continuing load... ('%S')\n", moduleFileName->Buffer); #endif NS_SetHasLoadedNewDLLs(); return stub_LdrLoadDll(filePath, flags, moduleFileName, handle); }