HRESULT WINAPI CExeDropHandler::Drop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) { TRACE ("(%p)\n", this); FORMATETC fmt; STGMEDIUM medium; LPWSTR pszSrcList; InitFormatEtc (fmt, CF_HDROP, TYMED_HGLOBAL); WCHAR wszBuf[MAX_PATH * 2 + 8], *pszEnd = wszBuf; size_t cchRemaining = _countof(wszBuf); if (SUCCEEDED(pDataObject->GetData(&fmt, &medium)) /* && SUCCEEDED(pDataObject->GetData(&fmt2, &medium))*/) { LPDROPFILES lpdf = (LPDROPFILES) GlobalLock(medium.hGlobal); if (!lpdf) { ERR("Error locking global\n"); return E_FAIL; } pszSrcList = (LPWSTR) (((byte*) lpdf) + lpdf->pFiles); while (*pszSrcList) { if (StrChrW(pszSrcList, L' ') && cchRemaining > 3) StringCchPrintfExW(pszEnd, cchRemaining, &pszEnd, &cchRemaining, 0, L"\"%ls\" ", pszSrcList); else StringCchPrintfExW(pszEnd, cchRemaining, &pszEnd, &cchRemaining, 0, L"%ls ", pszSrcList); pszSrcList += wcslen(pszSrcList) + 1; } } ShellExecuteW(NULL, L"open", sPathTarget, wszBuf, NULL,SW_SHOWNORMAL); return S_OK; }
HRESULT HackerContext::FrameAnalysisFilename(wchar_t *filename, size_t size, bool compute, bool uav, bool depth, int idx) { wchar_t *pos; size_t rem; HRESULT hr; StringCchPrintfExW(filename, size, &pos, &rem, NULL, L"%ls\\%06i", G->ANALYSIS_PATH, G->analyse_frame); if (uav) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-u%i", idx); else if (depth) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-oD"); else StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-o%i", idx); if (compute) { StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-cs-%016I64x", mCurrentComputeShader); } else { if (mCurrentVertexShader) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-vs-%016I64x", mCurrentVertexShader); if (mCurrentHullShader) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-hs-%016I64x", mCurrentHullShader); if (mCurrentDomainShader) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-ds-%016I64x", mCurrentDomainShader); if (mCurrentGeometryShader) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-gs-%016I64x", mCurrentGeometryShader); if (mCurrentPixelShader) StringCchPrintfExW(pos, rem, &pos, &rem, NULL, L"-ps-%016I64x", mCurrentPixelShader); } hr = StringCchPrintfW(pos, rem, L".XXX"); if (FAILED(hr)) { LogInfo("frame analysis: failed to create filename: 0x%x\n", hr); // Could create a shorter filename without hashes if this // becomes a problem in practice } return hr; }
BOOL CFileDefExt::InitFileType(HWND hwndDlg) { TRACE("path %s\n", debugstr_w(m_wszPath)); HWND hDlgCtrl = GetDlgItem(hwndDlg, 14005); if (hDlgCtrl == NULL) return FALSE; /* Get file information */ SHFILEINFO fi; if (!SHGetFileInfoW(m_wszPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME|SHGFI_ICON)) { ERR("SHGetFileInfoW failed for %ls (%lu)\n", m_wszPath, GetLastError()); fi.szTypeName[0] = L'\0'; fi.hIcon = NULL; } LPCWSTR pwszExt = PathFindExtensionW(m_wszPath); if (pwszExt[0]) { WCHAR wszBuf[256]; if (!fi.szTypeName[0]) { /* The file type is unknown, so default to string "FileExtension File" */ size_t cchRemaining = 0; LPWSTR pwszEnd = NULL; StringCchPrintfExW(wszBuf, _countof(wszBuf), &pwszEnd, &cchRemaining, 0, L"%s ", pwszExt + 1); SendMessageW(hDlgCtrl, WM_GETTEXT, (WPARAM)cchRemaining, (LPARAM)pwszEnd); SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)wszBuf); } else { /* Update file type */ StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s (%s)", fi.szTypeName, pwszExt); SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)wszBuf); } } /* Update file icon */ if (fi.hIcon) SendDlgItemMessageW(hwndDlg, 14000, STM_SETICON, (WPARAM)fi.hIcon, 0); else ERR("No icon %ls\n", m_wszPath); return TRUE; }
/****************************************************************** * * OnPaint * ******************************************************************/ void OnPaint(_In_ HDC hdc, _In_ PRECT prcPaint) { HRESULT hr; WCHAR wzText[1024]; FillRect(hdc, prcPaint, (HBRUSH)GetStockObject(WHITE_BRUSH)); const TimerRec& nocoal = gTimerRec[TIMERID_NOCOALSCING]; const TimerRec& coal = gTimerRec[TIMERID_COALESCING]; hr = StringCchPrintfExW(wzText, ARRAYSIZE(wzText), NULL, NULL, STRSAFE_NULL_ON_FAILURE, L"Timer non-coalesced Min = %I64d, Avg = %.1f, Max = %I64d, (%I64d / %I64d)\n\n" L"Timer coalesced Min = %I64d, Avg = %.1f, Max = %I64d, (%I64d / %I64d)\n\n" L"[Elapse = %dms, Coaclescing tolerance = %dms]\n\n" L"Hit space to turn off the monitor", MakeItLookNormal(nocoal.lElapsedMin), Average(nocoal.lSum, nocoal.lCount), nocoal.lElapsedMax, nocoal.lSum, nocoal.lCount, MakeItLookNormal(coal.lElapsedMin), Average(coal.lSum, coal.lCount), coal.lElapsedMax, coal.lSum, coal.lCount, TIMER_ELAPSE, TIMER_TOLERANCE); if (SUCCEEDED(hr)) { DrawText(hdc, wzText, -1, prcPaint, DT_TOP | DT_LEFT); } }
BOOL QueryEventMessages(LPWSTR lpMachineName, LPWSTR lpLogName) { HWND hwndDlg = NULL; HANDLE hEventLog; EVENTLOGRECORD *pevlr; DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords = 0, dwCurrentRecord = 0, dwRecordsToRead = 0, dwFlags, dwMaxLength; size_t cchRemaining; LPWSTR lpSourceName; LPWSTR lpComputerName; LPSTR lpData; BOOL bResult = TRUE; /* Read succeeded. */ WCHAR szWindowTitle[MAX_PATH]; WCHAR szStatusText[MAX_PATH]; WCHAR szLocalDate[MAX_PATH]; WCHAR szLocalTime[MAX_PATH]; WCHAR szEventID[MAX_PATH]; WCHAR szEventTypeText[MAX_LOADSTRING]; WCHAR szCategoryID[MAX_PATH]; WCHAR szUsername[MAX_PATH]; WCHAR szEventText[EVENT_MESSAGE_FILE_BUFFER]; WCHAR szCategory[MAX_PATH]; WCHAR szData[MAX_PATH]; PWCHAR lpTitleTemplateEnd; SYSTEMTIME time; LVITEMW lviEventItem; dwFlags = EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ; /* Open the event log. */ hEventLog = OpenEventLogW(lpMachineName, lpLogName); if (hEventLog == NULL) { ShowLastWin32Error(); return FALSE; } lpSourceLogName = lpLogName; lpComputerName = lpMachineName; /* Disable listview redraw */ SendMessage(hwndListView, WM_SETREDRAW, FALSE, 0); /* Clear the list view */ (void)ListView_DeleteAllItems (hwndListView); FreeRecords(); GetOldestEventLogRecord(hEventLog, &dwThisRecord); /* Get the total number of event log records. */ GetNumberOfEventLogRecords (hEventLog , &dwTotalRecords); g_TotalRecords = dwTotalRecords; if (dwTotalRecords > 0) { EnableMenuItem(hMainMenu, IDM_CLEAR_EVENTS, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMainMenu, IDM_SAVE_PROTOCOL, MF_BYCOMMAND | MF_ENABLED); } else { EnableMenuItem(hMainMenu, IDM_CLEAR_EVENTS, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMainMenu, IDM_SAVE_PROTOCOL, MF_BYCOMMAND | MF_GRAYED); } g_RecordPtrs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwTotalRecords * sizeof(PVOID)); /* If we have at least 1000 records show the waiting dialog */ if (dwTotalRecords > 1000) { CloseHandle(CreateThread(NULL, 0, ShowStatusMessageThread, (LPVOID)&hwndDlg, 0, NULL)); } while (dwCurrentRecord < dwTotalRecords) { pevlr = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); g_RecordPtrs[dwCurrentRecord] = pevlr; bResult = ReadEventLog(hEventLog, // Event log handle dwFlags, // Sequential read 0, // Ignored for sequential read pevlr, // Pointer to buffer sizeof(EVENTLOGRECORD), // Size of buffer &dwRead, // Number of bytes read &dwNeeded); // Bytes in the next record if((!bResult) && (GetLastError () == ERROR_INSUFFICIENT_BUFFER)) { HeapFree(GetProcessHeap(), 0, pevlr); pevlr = HeapAlloc(GetProcessHeap(), 0, dwNeeded); g_RecordPtrs[dwCurrentRecord] = pevlr; ReadEventLogW(hEventLog, // event log handle dwFlags, // read flags 0, // offset; default is 0 pevlr, // pointer to buffer dwNeeded, // size of buffer &dwRead, // number of bytes read &dwNeeded); // bytes in next record } while (dwRead > 0) { LoadStringW(hInst, IDS_NOT_AVAILABLE, szUsername, MAX_PATH); LoadStringW(hInst, IDS_NOT_AVAILABLE, szEventText, MAX_PATH); LoadStringW(hInst, IDS_NONE, szCategory, MAX_PATH); // Get the event source name. lpSourceName = (LPWSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD)); // Get the computer name lpComputerName = (LPWSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD) + (wcslen(lpSourceName) + 1) * sizeof(WCHAR)); // This ist the data section of the current event lpData = (LPSTR)((LPBYTE)pevlr + pevlr->DataOffset); // Compute the event type EventTimeToSystemTime(pevlr->TimeWritten, &time); // Get the username that generated the event GetEventUserName(pevlr, szUsername); GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &time, NULL, szLocalDate, MAX_PATH); GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &time, NULL, szLocalTime, MAX_PATH); GetEventType(pevlr->EventType, szEventTypeText); GetEventCategory(lpLogName, lpSourceName, pevlr, szCategory); StringCbPrintfW(szEventID, sizeof(szEventID), L"%u", (pevlr->EventID & 0xFFFF)); StringCbPrintfW(szCategoryID, sizeof(szCategoryID), L"%u", pevlr->EventCategory); lviEventItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM; lviEventItem.iItem = 0; lviEventItem.iSubItem = 0; lviEventItem.lParam = (LPARAM)pevlr; lviEventItem.pszText = szEventTypeText; switch (pevlr->EventType) { case EVENTLOG_ERROR_TYPE: lviEventItem.iImage = 2; break; case EVENTLOG_AUDIT_FAILURE: lviEventItem.iImage = 2; break; case EVENTLOG_WARNING_TYPE: lviEventItem.iImage = 1; break; case EVENTLOG_INFORMATION_TYPE: lviEventItem.iImage = 0; break; case EVENTLOG_AUDIT_SUCCESS: lviEventItem.iImage = 0; break; case EVENTLOG_SUCCESS: lviEventItem.iImage = 0; break; } lviEventItem.iItem = ListView_InsertItem(hwndListView, &lviEventItem); ListView_SetItemText(hwndListView, lviEventItem.iItem, 1, szLocalDate); ListView_SetItemText(hwndListView, lviEventItem.iItem, 2, szLocalTime); ListView_SetItemText(hwndListView, lviEventItem.iItem, 3, lpSourceName); ListView_SetItemText(hwndListView, lviEventItem.iItem, 4, szCategory); ListView_SetItemText(hwndListView, lviEventItem.iItem, 5, szEventID); ListView_SetItemText(hwndListView, lviEventItem.iItem, 6, szUsername); //User ListView_SetItemText(hwndListView, lviEventItem.iItem, 7, lpComputerName); //Computer MultiByteToWideChar(CP_ACP, 0, lpData, pevlr->DataLength, szData, MAX_PATH); ListView_SetItemText(hwndListView, lviEventItem.iItem, 8, szData); //Event Text dwRead -= pevlr->Length; pevlr = (EVENTLOGRECORD *)((LPBYTE) pevlr + pevlr->Length); } dwRecordsToRead--; dwCurrentRecord++; } // All events loaded if(hwndDlg) EndDialog(hwndDlg, 0); StringCchPrintfExW(szWindowTitle, sizeof(szWindowTitle) / sizeof(WCHAR), &lpTitleTemplateEnd, &cchRemaining, 0, szTitleTemplate, szTitle, lpLogName); /* i = number of characters written */ /* lpComputerName can be NULL here if no records was read */ dwMaxLength = (DWORD)cchRemaining; if (!lpComputerName) GetComputerNameW(lpTitleTemplateEnd, &dwMaxLength); else StringCchCopyW(lpTitleTemplateEnd, dwMaxLength, lpComputerName); StringCbPrintfW(szStatusText, sizeof(szStatusText), szStatusBarTemplate, lpLogName, dwTotalRecords); // Update the status bar SendMessageW(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)szStatusText); // Set the window title SetWindowTextW(hwndMainWindow, szWindowTitle); // Resume list view redraw SendMessageW(hwndListView, WM_SETREDRAW, TRUE, 0); // Close the event log. CloseEventLog(hEventLog); return TRUE; }
///////////////////////////////////////////////////////// // // GetComponentInfo // // This helper function, provided with a component // ProgId, gathers the component's name and version // info and formats them into output strings // // Parameters: // CLSID clsid : [in] component's CLSID // SInfo& info : [in, out] a structure of buffers // to get the formatted strings into // // Return Values: // TRUE, if the function succeeds // FALSE, if it fails // ///////////////////////////////////////////////////////// BOOL GetComponentInfo(CLSID clsid, SInfo& info) { info.wchName[0] = info.wchVersion[0] = 0; // Format Registry Key string WCHAR wszKey[45] = L"CLSID\\"; // the key buffer should be large enough for a string // like "CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" // Convert CLSID to String UINT uPos = lstrlenW(wszKey); if (0 == StringFromGUID2(clsid, &wszKey[uPos], countof(wszKey) - uPos)) return FALSE; wszKey[countof(wszKey)-1] = 0; // Open key to find path of application HKEY hKeyRoot; if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszKey, 0, KEY_READ, &hKeyRoot) != ERROR_SUCCESS) return FALSE; // Query value of key to get the name of the component ULONG cSize = sizeof(info.wchName); // size of the buffer in bytes if (RegQueryValueExW(hKeyRoot, NULL, NULL, NULL, (BYTE*)info.wchName, &cSize) != ERROR_SUCCESS) { RegCloseKey(hKeyRoot); return FALSE; } info.wchName[countof(info.wchName) - 1] = 0; // Open the version info subkey UINT iVersionMaxLen = countof(info.wchVersion); HKEY hKey = NULL; if (RegOpenKeyExW(hKeyRoot, L"Version", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { const WCHAR* pcwsVersion = L"version "; UINT iLen = lstrlenW(pcwsVersion); // Query value of key to get version string if (iLen < iVersionMaxLen) { // copy the "version " string including terminating 0 wcsncpy_s(info.wchVersion, iVersionMaxLen, pcwsVersion, iLen + 1); // get the version string cSize = (iVersionMaxLen - iLen) * sizeof(WCHAR); // the size is in bytes if (RegQueryValueExW(hKey, NULL, NULL, NULL, (BYTE*)&info.wchVersion[iLen], &cSize) == ERROR_SUCCESS) { info.wchVersion[iVersionMaxLen-1] = 0; } } RegCloseKey(hKey); } // Open InprocServer32 subkey to get the path to the component if (RegOpenKeyExW(hKeyRoot, L"InprocServer32", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { // Query value of key to get the path string WCHAR wchPath[MAX_PATH]; cSize = sizeof(wchPath); if (RegQueryValueExW(hKey, NULL, NULL, NULL, (BYTE*)wchPath, &cSize) == ERROR_SUCCESS) { // Get the build number from the file version info DWORD dwHandle = 0; cSize = GetFileVersionInfoSizeW(wchPath, &dwHandle); // returns the size in bytes WCHAR* pwchFileVerInfo = NULL; if (cSize) { pwchFileVerInfo = (WCHAR*)new BYTE[cSize]; } if (NULL != pwchFileVerInfo) { // Retrieve version information for the file if (GetFileVersionInfoW(wchPath, 0, cSize, pwchFileVerInfo)) { // Get the default language id and code page number UINT *pdwLang; UINT cch = 0; if (VerQueryValueW(pwchFileVerInfo, L"\\VarFileInfo\\Translation", (void**)&pdwLang, &cch) == TRUE) { // Read the file description for the language and code page. const int MAX_SUBBLOCK = 40; WCHAR wchSubBlock[MAX_SUBBLOCK]; // large enough for the string StringCchPrintfExW(wchSubBlock, MAX_SUBBLOCK, NULL, NULL, STRSAFE_NULL_ON_FAILURE, L"\\StringFileInfo\\%04x%04x\\FileVersion", LOWORD(*pdwLang), HIWORD(*pdwLang)); WCHAR* pwchBuildVer = NULL; if ((VerQueryValueW(pwchFileVerInfo, wchSubBlock, (void**)&pwchBuildVer, &cch) == TRUE) && (NULL != pwchBuildVer)) { // Format the version string UINT iLen = (UINT)lstrlenW(info.wchVersion); if (0 < iLen) { if (iLen < iVersionMaxLen) { const WCHAR* pcwsBuild = L", build "; wcsncpy_s(info.wchVersion + iLen, iVersionMaxLen - iLen, pcwsBuild, iVersionMaxLen - iLen); iLen += lstrlenW(pcwsBuild); if (iLen < iVersionMaxLen) { wcsncpy_s(info.wchVersion + iLen, iVersionMaxLen - iLen, pwchBuildVer, iVersionMaxLen - iLen); } } } else { wcsncpy_s(info.wchVersion, iVersionMaxLen, pwchBuildVer, iVersionMaxLen); } info.wchVersion[iVersionMaxLen-1] = 0; } } } delete [] pwchFileVerInfo; } } RegCloseKey(hKey); } RegCloseKey(hKeyRoot); return TRUE; }