Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

190 lines
4.8 KiB

// AppReport.cpp : Implementation of CAppReport
#include "stdafx.h"
#include "Appcompr.h"
#include "AppReport.h"
#include "progview.h"
#include "upload.h"
/////////////////////////////////////////////////////////////////////////////
// CAppReport
STDMETHODIMP CAppReport::BrowseForExecutable(
BSTR bstrWinTitle,
BSTR bstrPreviousPath,
VARIANT *bstrExeName
)
{
WCHAR NameBuffer[MAX_PATH]={0};
WCHAR Filter[MAX_PATH];
OPENFILENAMEW FileToOpen;
BOOL result;
HWND hParent;
BOOL bNT4 = FALSE;
DWORD dwVersion = GetVersion();
DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
CComBSTR WindowText = L"AppCompat Report Proto - Microsoft Internet Explorer";
CComBSTR FileName = L"";
if (dwWindowsMajorVersion < 5)
{
::MessageBoxW(NULL,L"Invalid OS",NULL,MB_OK);
}
if (dwVersion < 0x80000000)
{
if (dwWindowsMajorVersion == 4)
bNT4 = TRUE;
}
GetWindowHandle(WindowText, &hParent);
if (bNT4)
{
FileToOpen.lStructSize = sizeof(OPENFILENAME);
}
else
{
FileToOpen.lStructSize = sizeof (OPENFILENAMEW);
}
FileToOpen.hwndOwner = hParent;
FileToOpen.hInstance = NULL;
StringCbCopyW(Filter, sizeof(Filter), L"Executable Files;*.exe");
Filter[16] = L'\0'; Filter[23]=L'\0'; // make a multi-string
FileToOpen.lpstrFilter = Filter;
FileToOpen.lpstrCustomFilter = NULL;
FileToOpen.nMaxCustFilter = 0;
FileToOpen.nFilterIndex = 1;
if (bstrPreviousPath == NULL)
{
bstrPreviousPath = L"";
}
StringCbCopyW(NameBuffer, sizeof(NameBuffer), bstrPreviousPath);
FileToOpen.lpstrFile = NameBuffer;
FileToOpen.nMaxFile = MAX_PATH;
FileToOpen.lpstrFileTitle = NULL;
FileToOpen.lpstrInitialDir = NULL;
FileToOpen.lpstrTitle = L"Application Not Compatible";
FileToOpen.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST ;
FileToOpen.lpstrDefExt = NULL;
FileToOpen.lCustData = 0L;
FileToOpen.lpfnHook = NULL;
result = GetOpenFileNameW(&FileToOpen);
if (!result)
{
bstrExeName->vt = VT_BSTR;
bstrExeName->bstrVal = FileName.Detach();
return S_OK;
}
else
{
FileName = FileToOpen.lpstrFile;
bstrExeName->vt = VT_BSTR;
bstrExeName->bstrVal = FileName.Detach();
}
return S_OK;
}
STDMETHODIMP CAppReport::GetApplicationFromList(
BSTR bstrTitle,
VARIANT *bstrExeName
)
{
ULONG res;
HWND hParent;
WCHAR wszAppName[MAX_PATH];
CComBSTR FileName = L"";
GetWindowHandle(NULL, &hParent);
wszAppName[0] = 0;
res = (ULONG) DialogBoxParamW(::_Module.GetModuleInstance(),
MAKEINTRESOURCEW(IDD_PROGRAM_LIST_DIALOG),
hParent,
Dialog_GetProgFromList,
(LPARAM) wszAppName);
if (res == IDOK)
{
FileName = wszAppName;
}
bstrExeName->vt = VT_BSTR;
bstrExeName->bstrVal = FileName.Detach();
return S_OK;
}
STDMETHODIMP CAppReport::CreateReport(BSTR bstrTitle, BSTR bstrProblemType, BSTR bstrComment, BSTR bstrACWResult,
BSTR bstrAppName, VARIANT *DwResult)
{
LPWSTR wszAppCompatText = NULL;
HRESULT hr;
OSVERSIONINFO OsVer = {0};
DwResult->vt = VT_INT;
DwResult->intVal = 0;
OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVer);
if ((OsVer.dwMajorVersion < 5) ||
(OsVer.dwMajorVersion == 5 && OsVer.dwMinorVersion == 0))
{
DwResult->intVal = ERROR_APPRPT_OS_NOT_SUPPORTED;
return S_OK;
}
// Generate app compat text file using apphelp.dll
__try {
hr = GenerateAppCompatText(bstrAppName, &wszAppCompatText);
} __except (EXCEPTION_EXECUTE_HANDLER) {
hr = E_FAIL;
}
if (hr != S_OK)
{
DwResult->intVal = ERROR_APPRPT_COMPAT_TEXT;
return S_OK;
}
// Send error report using faultrep.dll
hr = UploadAppProblem(bstrAppName, bstrProblemType, bstrComment,
bstrACWResult,
wszAppCompatText);
if (FAILED(hr))
{
hr = ERROR_APPRPT_UPLOADING;
}
DwResult->intVal = hr;
return S_OK;
}
HRESULT
CAppReport::GetWindowHandle(
LPWSTR wszWinTitle,
HWND* phwnd
)
{
*phwnd = ::GetActiveWindow();
if (*phwnd == NULL)
{
::MessageBoxW(NULL, L"No active window", NULL, MB_OK);
}
*phwnd = ::GetForegroundWindow();
return S_OK;
WCHAR Title[MAX_PATH];
::GetWindowTextW(*phwnd, Title, sizeof(Title)/sizeof(WCHAR));
::MessageBoxW(NULL, Title, NULL, MB_OK);
}