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.
2768 lines
69 KiB
2768 lines
69 KiB
#include "main.h"
|
|
#include "UserMode.h"
|
|
#include "WinMessages.h"
|
|
#include "CUserList.h"
|
|
#include "ReportFault.h"
|
|
|
|
|
|
DWORD uTextOffset = 10;
|
|
DWORD uBucketWindowSize = 120;
|
|
BOOL UserListItemSelected = FALSE;
|
|
|
|
|
|
|
|
extern TCHAR szUserColumnHeaders[][100];
|
|
extern GLOBAL_POLICY GlobalPolicy;
|
|
|
|
typedef enum LEVEL {APPNAME, APPVER, MODNAME,MODVER, OFFSET};
|
|
extern TCHAR CerRoot[];
|
|
extern HINSTANCE g_hinst;
|
|
extern HWND hUserMode;
|
|
extern CUserList cUserData;
|
|
HWND g_hUMListView = NULL;
|
|
BOOL g_bUMSortAsc = TRUE;
|
|
int g_dwUmodeIndex = -1;
|
|
int g_iSelCurrent = -1;
|
|
extern BOOL g_bFirstBucket;
|
|
extern g_bAdminAccess;
|
|
BOOL bCapture = FALSE;
|
|
|
|
BOOL ParsePolicy( TCHAR *Path, PUSER_DATA pUserData, BOOL Global);
|
|
int CALLBACK UmCompareFunc (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
int Result = -1;
|
|
int SubItemIndex = (INT) lParamSort;
|
|
int Item1 = 0;
|
|
int Item2 = 0;
|
|
// int OldIndex = 0;
|
|
TCHAR String1 [1000];
|
|
TCHAR String2 [1000];
|
|
PUSER_DATA pItem1 = NULL;
|
|
PUSER_DATA pItem2 = NULL;
|
|
|
|
ZeroMemory(String1, sizeof String1);
|
|
ZeroMemory(String2, sizeof String2);
|
|
|
|
ListView_GetItemText( g_hUMListView, lParam1, SubItemIndex, String1, 1000);
|
|
ListView_GetItemText( g_hUMListView, lParam2, SubItemIndex, String2, 1000);
|
|
|
|
pItem1 = cUserData.GetEntry(lParam1);
|
|
pItem2 = cUserData.GetEntry(lParam2);
|
|
if (g_bUMSortAsc) // Sort Acending
|
|
{
|
|
if ((lParamSort == 0) || (lParamSort == 6) || (lParamSort == 7) || (lParamSort == 8))
|
|
{
|
|
// Conver to int and compare
|
|
Item1 = atoi(String1);
|
|
Item2 = atoi(String2);
|
|
if (Item1 > Item2)
|
|
Result = 1;
|
|
else
|
|
Result = -1;
|
|
}
|
|
else
|
|
{
|
|
Result = _tcsicmp(String1,String2);
|
|
}
|
|
}
|
|
else // Sort Decending
|
|
{
|
|
if ((lParamSort == 0) || (lParamSort == 6) || (lParamSort == 7) || (lParamSort == 8))
|
|
{
|
|
// Conver to int and compare
|
|
Item1 = atoi(String1);
|
|
Item2 = atoi(String2);
|
|
if (Item1 > Item2)
|
|
Result = -1;
|
|
else
|
|
Result = 1;
|
|
}
|
|
else
|
|
{
|
|
Result = -_tcsicmp(String1,String2);
|
|
}
|
|
|
|
}
|
|
return Result;
|
|
}
|
|
|
|
|
|
void PopulateFilters(HWND hwnd)
|
|
{
|
|
COMBOBOXEXITEM cbi;
|
|
BOOL bEOF = FALSE;
|
|
// int iIndex = 0;
|
|
USER_DATA UserData;
|
|
HWND hAppnameFltr = GetDlgItem(hwnd, IDC_APPNAME_FILTER);
|
|
HWND hAppverFltr = GetDlgItem(hwnd, IDC_APPVER_FILTER);
|
|
HWND hModnameFltr = GetDlgItem(hwnd, IDC_MODNAME_FILTER);
|
|
HWND hModverFltr = GetDlgItem(hwnd, IDC_MODVER_FILTER);
|
|
// Now run through the UserMode linked list and populate the filters.
|
|
ZeroMemory(&cbi, sizeof COMBOBOXEXITEM);
|
|
|
|
ComboBox_ResetContent(hAppnameFltr);
|
|
ComboBox_ResetContent(hAppverFltr);
|
|
ComboBox_ResetContent(hModnameFltr);
|
|
ComboBox_ResetContent(hModverFltr);
|
|
ComboBox_InsertString(hAppnameFltr,0,_T("(All Applications)"));
|
|
ComboBox_SetCurSel(hAppnameFltr, 0);
|
|
ComboBox_InsertString(hAppverFltr,0,_T("(All Application Versions)"));
|
|
ComboBox_SetCurSel(hAppverFltr, 0);
|
|
ComboBox_InsertString(hModnameFltr,0,_T("(All Modules)"));
|
|
ComboBox_SetCurSel(hModnameFltr, 0);
|
|
ComboBox_InsertString(hModverFltr,0,_T("(All Module Versions)"));
|
|
ComboBox_SetCurSel(hModverFltr, 0);
|
|
|
|
// Now for each entry in the cUserData Linked list fill in the filters
|
|
// Avoiding duplicates if possible.
|
|
cUserData.ResetCurrPos();
|
|
while(cUserData.GetNextEntry(&UserData, &bEOF))
|
|
{
|
|
if (ComboBox_FindStringExact(hAppnameFltr, -1, UserData.AppName) == CB_ERR)
|
|
ComboBox_InsertString(hAppnameFltr,1,UserData.AppName);
|
|
if (ComboBox_FindStringExact(hAppverFltr, -1, UserData.AppVer) == CB_ERR)
|
|
ComboBox_InsertString(hAppverFltr,1,UserData.AppVer);
|
|
if (ComboBox_FindStringExact(hModnameFltr, -1, UserData.ModName) == CB_ERR)
|
|
ComboBox_InsertString(hModnameFltr,1,UserData.ModName);
|
|
if (ComboBox_FindStringExact(hModverFltr, -1, UserData.ModVer) == CB_ERR)
|
|
ComboBox_InsertString(hModverFltr,1,UserData.ModVer);
|
|
}
|
|
}
|
|
|
|
|
|
void PopulateFiltersWSelection(HWND hwnd)
|
|
{
|
|
// COMBOBOXEXITEM cbi;
|
|
BOOL bEOF = FALSE;
|
|
// int iIndex = 0;
|
|
USER_DATA UserData;
|
|
HWND hAppnameFltr = GetDlgItem(hwnd, IDC_APPNAME_FILTER);
|
|
HWND hAppverFltr = GetDlgItem(hwnd, IDC_APPVER_FILTER);
|
|
HWND hModnameFltr = GetDlgItem(hwnd, IDC_MODNAME_FILTER);
|
|
HWND hModverFltr = GetDlgItem(hwnd, IDC_MODVER_FILTER);
|
|
|
|
TCHAR AppNameFilter[MAX_PATH];
|
|
TCHAR AppVerFilter[MAX_PATH];
|
|
TCHAR ModNameFilter[MAX_PATH];
|
|
TCHAR ModVerFilter[MAX_PATH];
|
|
|
|
BOOL bUseAppName = FALSE;
|
|
BOOL bUseAppVer = FALSE;
|
|
BOOL bUseModName = FALSE;
|
|
BOOL bUseModVer = FALSE;
|
|
|
|
|
|
int iAppNameSel = 0;
|
|
int iAppVerSel = 0;
|
|
int iModNameSel = 0;
|
|
int iModVerSel = 0;
|
|
|
|
iAppNameSel = ComboBox_GetCurSel(hAppnameFltr);
|
|
iAppVerSel = ComboBox_GetCurSel(hAppverFltr);
|
|
iModNameSel = ComboBox_GetCurSel(hModnameFltr);
|
|
iModVerSel = ComboBox_GetCurSel(hModverFltr);
|
|
// Get the current Filter Selection Strings.
|
|
if (iAppNameSel != 0)
|
|
{
|
|
bUseAppName = TRUE;
|
|
ComboBox_GetLBText(hAppnameFltr,iAppNameSel, AppNameFilter);
|
|
}
|
|
if (iAppVerSel != 0)
|
|
{
|
|
bUseAppVer = TRUE;
|
|
ComboBox_GetLBText(hAppverFltr,iAppVerSel, AppVerFilter);
|
|
}
|
|
if (iModNameSel != 0)
|
|
{
|
|
bUseModName = TRUE;
|
|
ComboBox_GetLBText(hModnameFltr,iModNameSel, ModNameFilter);
|
|
}
|
|
if (iModVerSel != 0)
|
|
{
|
|
bUseModVer = TRUE;
|
|
ComboBox_GetLBText(hModverFltr,iModVerSel, ModVerFilter);
|
|
|
|
}
|
|
|
|
// Now run through the UserMode linked list and populate the filters.
|
|
//ZeroMemory(&cbi, sizeof COMBOBOXEXITEM);
|
|
|
|
|
|
ComboBox_ResetContent(hAppnameFltr);
|
|
ComboBox_ResetContent(hAppverFltr);
|
|
ComboBox_ResetContent(hModnameFltr);
|
|
ComboBox_ResetContent(hModverFltr);
|
|
|
|
ComboBox_InsertString(hAppnameFltr,0,_T("(All Applications)"));
|
|
ComboBox_SetCurSel(hAppnameFltr, 0);
|
|
ComboBox_InsertString(hAppverFltr,0,_T("(All Application Versions)"));
|
|
ComboBox_SetCurSel(hAppverFltr, 0);
|
|
ComboBox_InsertString(hModnameFltr,0,_T("(All Modules)"));
|
|
ComboBox_SetCurSel(hModnameFltr, 0);
|
|
ComboBox_InsertString(hModverFltr,0,_T("(All Module Versions)"));
|
|
ComboBox_SetCurSel(hModverFltr, 0);
|
|
|
|
if (bUseAppName)
|
|
{
|
|
bUseAppName = TRUE;
|
|
//ComboBox_GetLBText(hAppnameFltr,iAppNameSel, AppNameFilter);
|
|
ComboBox_InsertString(hAppnameFltr,1,AppNameFilter);
|
|
ComboBox_SetCurSel(hAppnameFltr, 1);
|
|
}
|
|
if (iAppVerSel != 0)
|
|
{
|
|
bUseAppVer = TRUE;
|
|
ComboBox_InsertString(hAppverFltr,1, AppVerFilter);
|
|
ComboBox_SetCurSel(hAppverFltr,1);
|
|
}
|
|
if (iModNameSel != 0)
|
|
{
|
|
bUseModName = TRUE;
|
|
ComboBox_InsertString(hModnameFltr,1, ModNameFilter);
|
|
ComboBox_SetCurSel(hModnameFltr,1);
|
|
}
|
|
if (iModVerSel != 0)
|
|
{
|
|
bUseModVer = TRUE;
|
|
ComboBox_InsertString(hModverFltr,1, ModVerFilter);
|
|
ComboBox_SetCurSel (hModverFltr,1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now for each entry in the cUserData Linked list fill in the filters
|
|
// Based on the previous filter settings.
|
|
|
|
cUserData.ResetCurrPos();
|
|
while(cUserData.GetNextEntry(&UserData, &bEOF))
|
|
{
|
|
|
|
//Add filters here.
|
|
if (bUseAppName)
|
|
{
|
|
// only show entries with the selected application name
|
|
if (_tcscmp(AppNameFilter, UserData.AppName))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseAppVer)
|
|
{
|
|
if (_tcscmp(AppVerFilter, UserData.AppVer))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseModName)
|
|
{
|
|
if (_tcscmp(ModNameFilter, UserData.ModName))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseModVer)
|
|
{
|
|
if (_tcscmp(ModVerFilter, UserData.ModVer))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
|
|
if (ComboBox_FindStringExact(hAppnameFltr, -1, UserData.AppName) == CB_ERR)
|
|
ComboBox_InsertString(hAppnameFltr,1,UserData.AppName);
|
|
if (ComboBox_FindStringExact(hAppverFltr, -1, UserData.AppVer) == CB_ERR)
|
|
ComboBox_InsertString(hAppverFltr,1,UserData.AppVer);
|
|
if (ComboBox_FindStringExact(hModnameFltr, -1, UserData.ModName) == CB_ERR)
|
|
ComboBox_InsertString(hModnameFltr,1,UserData.ModName);
|
|
if (ComboBox_FindStringExact(hModverFltr, -1, UserData.ModVer) == CB_ERR)
|
|
ComboBox_InsertString(hModverFltr,1,UserData.ModVer);
|
|
|
|
SkipEntry:
|
|
;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
OnUserDialogInit(
|
|
IN HWND hwnd
|
|
)
|
|
{
|
|
DWORD yOffset = 5;
|
|
RECT rc;
|
|
RECT rcButton;
|
|
RECT rcDlg;
|
|
RECT rcList;
|
|
RECT rcStatic;
|
|
//RECT rcVSlider;
|
|
HWND hParent = GetParent(hwnd);
|
|
HWND hButton = GetDlgItem(hParent, IDC_USERMODE);
|
|
HWND hCombo = GetDlgItem(hwnd, IDC_FLTR_RESPONSE);
|
|
RECT rcCombo;
|
|
HWND hVSlider = GetDlgItem(hwnd, IDC_VERT_SLIDER);
|
|
|
|
UserListItemSelected = FALSE;
|
|
HDC hDC = NULL;
|
|
TEXTMETRIC TextMetric;
|
|
GetClientRect(hParent, &rc);
|
|
GetWindowRect(hButton, &rcButton);
|
|
|
|
ScreenToClient(hButton, (LPPOINT)&rcButton.left);
|
|
ScreenToClient(hButton, (LPPOINT)&rcButton.right);
|
|
|
|
|
|
SetWindowPos(hwnd, HWND_TOP, rc.left + yOffset, rcButton.bottom + yOffset , rc.right - rc.left - yOffset, rc.bottom - rcButton.bottom - yOffset , 0);
|
|
|
|
GetWindowRect(hwnd, &rcDlg);
|
|
ScreenToClient(hwnd, (LPPOINT)&rcDlg.left);
|
|
ScreenToClient(hwnd, (LPPOINT)&rcDlg.right);
|
|
|
|
// Position the List View
|
|
GetClientRect(hCombo, &rcCombo);
|
|
// Position the List View
|
|
HWND hList = GetDlgItem(hwnd, IDC_USER_LIST);
|
|
SetWindowPos(hList,NULL, rcDlg.left + yOffset, rcDlg.top + (rcCombo.bottom - rcCombo.top), rcDlg.right - rcDlg.left - yOffset, rcDlg.bottom - uBucketWindowSize - (rcDlg.top + (rcCombo.bottom - rcCombo.top)) , SWP_NOZORDER);
|
|
GetWindowRect(hList, &rcList);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.left);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.right);
|
|
|
|
SetWindowPos(hVSlider,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + (rcCombo.bottom - rcCombo.top) ,
|
|
rcDlg.right - rcDlg.left - yOffset,
|
|
6,
|
|
SWP_NOZORDER);
|
|
// Position the bucket info window.
|
|
HWND hBucket2 = GetDlgItem(hwnd, IDC_BUCKETTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + uTextOffset + (rcCombo.bottom - rcCombo.top) ,
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
|
|
hBucket2 = GetDlgItem(hwnd, IDC_NOTESTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
(rcDlg.right - rcDlg.left) /2 + uTextOffset,
|
|
rcList.bottom + uTextOffset + (rcCombo.bottom - rcCombo.top),
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
SetDlgItemText(hwnd, IDC_BUCKETTEXT,"Bucket Information:");
|
|
|
|
GetClientRect (hBucket2, &rcStatic);
|
|
|
|
HWND hBucket = GetDlgItem (hwnd, IDC_USER_EDIT);
|
|
if (hBucket)
|
|
{
|
|
SetWindowPos(hBucket,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top) + 5 ,
|
|
(rcDlg.right - rcDlg.left) /2 - yOffset ,
|
|
rcDlg.bottom - (rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top)+5 ),
|
|
SWP_NOZORDER);
|
|
}
|
|
HWND hNotes = GetDlgItem (hwnd, IDC_NOTES);
|
|
if (hNotes)
|
|
{
|
|
SetWindowPos(hNotes,
|
|
NULL,
|
|
(rcDlg.right - rcDlg.left) /2 + uTextOffset,
|
|
rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top) + 5 ,
|
|
(rcDlg.right - rcDlg.left) /2 - uTextOffset,
|
|
rcDlg.bottom - (rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top)+5 ),
|
|
SWP_NOZORDER);
|
|
}
|
|
|
|
|
|
LVCOLUMN lvc;
|
|
int iCol;
|
|
|
|
// Set the extended styles
|
|
ListView_SetExtendedListViewStyleEx(hList,
|
|
LVS_EX_GRIDLINES |
|
|
LVS_EX_HEADERDRAGDROP |
|
|
LVS_EX_FULLROWSELECT,
|
|
LVS_EX_GRIDLINES |
|
|
LVS_EX_FULLROWSELECT |
|
|
LVS_EX_HEADERDRAGDROP);
|
|
|
|
// Initialize the LVCOLUMN structure.
|
|
// The mask specifies that the format, width, text, and subitem
|
|
// members of the structure are valid.
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
|
|
hDC = GetDC(hwnd);
|
|
GetTextMetrics(hDC, &TextMetric);
|
|
// Add the columns.
|
|
for (iCol = 0; iCol < USER_COL_COUNT; iCol++)
|
|
{
|
|
lvc.iSubItem = iCol;
|
|
lvc.pszText = szUserColumnHeaders[iCol];
|
|
lvc.cx = _tcslen(szUserColumnHeaders[iCol]) * TextMetric.tmAveCharWidth + 8 ; // width of column in pixels
|
|
lvc.fmt = LVCFMT_LEFT; // left-aligned column
|
|
if (ListView_InsertColumn(hList, iCol, &lvc) == -1)
|
|
{
|
|
;
|
|
}
|
|
|
|
}
|
|
|
|
ReleaseDC(hwnd, hDC);
|
|
ListView_SetColumnWidth(hList, USER_COL_COUNT-1, LVSCW_AUTOSIZE_USEHEADER);
|
|
g_hUMListView = hList;
|
|
|
|
}
|
|
|
|
void ResizeUserMode(HWND hwnd)
|
|
{
|
|
DWORD yOffset = 5;
|
|
RECT rc;
|
|
RECT rcButton;
|
|
RECT rcDlg;
|
|
RECT rcList;
|
|
RECT rcStatic;
|
|
HWND hParent = GetParent(hwnd);
|
|
HWND hButton = GetDlgItem(hParent, IDC_USERMODE);
|
|
HWND hCombo = GetDlgItem(hwnd, IDC_FLTR_RESPONSE);
|
|
RECT rcCombo;
|
|
HWND hVSlider = GetDlgItem(hwnd, IDC_VERT_SLIDER);
|
|
UserListItemSelected = FALSE;
|
|
GetClientRect(hParent, &rc);
|
|
GetWindowRect(hButton, &rcButton);
|
|
|
|
ScreenToClient(hButton, (LPPOINT)&rcButton.left);
|
|
ScreenToClient(hButton, (LPPOINT)&rcButton.right);
|
|
|
|
|
|
SetWindowPos(hwnd, HWND_TOP, rc.left + yOffset, rcButton.bottom + yOffset , rc.right - rc.left - yOffset, rc.bottom - rcButton.bottom - yOffset , 0);
|
|
|
|
GetWindowRect(hwnd, &rcDlg);
|
|
ScreenToClient(hwnd, (LPPOINT)&rcDlg.left);
|
|
ScreenToClient(hwnd, (LPPOINT)&rcDlg.right);
|
|
|
|
// Position the List View
|
|
GetClientRect(hCombo, &rcCombo);
|
|
// Position the List View
|
|
HWND hList = GetDlgItem(hwnd, IDC_USER_LIST);
|
|
SetWindowPos(hList,NULL, rcDlg.left + yOffset, rcDlg.top + (rcCombo.bottom - rcCombo.top) , rcDlg.right - rcDlg.left - yOffset, rcDlg.bottom - uBucketWindowSize - (rcDlg.top + (rcCombo.bottom - rcCombo.top)) , SWP_NOZORDER);
|
|
GetWindowRect(hList, &rcList);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.left);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.right);
|
|
|
|
SetWindowPos(hVSlider,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + (rcCombo.bottom - rcCombo.top) ,
|
|
rcDlg.right - rcDlg.left - yOffset,
|
|
6,
|
|
SWP_NOZORDER);
|
|
// Position the bucket info window.
|
|
HWND hBucket2 = GetDlgItem(hwnd, IDC_BUCKETTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + uTextOffset + (rcCombo.bottom - rcCombo.top) ,
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
|
|
hBucket2 = GetDlgItem(hwnd, IDC_NOTESTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
(rcDlg.right - rcDlg.left) /2 + uTextOffset,
|
|
rcList.bottom + uTextOffset + (rcCombo.bottom - rcCombo.top) ,
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
SetDlgItemText(hwnd, IDC_BUCKETTEXT,"Bucket Information:");
|
|
|
|
GetClientRect (hBucket2, &rcStatic);
|
|
|
|
HWND hBucket = GetDlgItem (hwnd, IDC_USER_EDIT);
|
|
if (hBucket)
|
|
{
|
|
SetWindowPos(hBucket,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top) + 5 ,
|
|
(rcDlg.right - rcDlg.left) /2 - yOffset ,
|
|
rcDlg.bottom - (rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top)+5 ),
|
|
SWP_NOZORDER);
|
|
}
|
|
HWND hNotes = GetDlgItem (hwnd, IDC_NOTES);
|
|
if (hNotes)
|
|
{
|
|
SetWindowPos(hNotes,
|
|
NULL,
|
|
(rcDlg.right - rcDlg.left) /2 + uTextOffset,
|
|
rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top) + 5 ,
|
|
(rcDlg.right - rcDlg.left) /2 - uTextOffset,
|
|
rcDlg.bottom - (rcList.bottom + uTextOffset + (rcStatic.bottom - rcStatic.top) + (rcCombo.bottom - rcCombo.top)+5 ),
|
|
SWP_NOZORDER);
|
|
}
|
|
|
|
|
|
|
|
ListView_SetColumnWidth(hList, USER_COL_COUNT-1, LVSCW_AUTOSIZE_USEHEADER);
|
|
|
|
}
|
|
|
|
|
|
void RefreshUserMode(HWND hwnd)
|
|
{
|
|
|
|
|
|
LVITEM lvi;
|
|
// TCHAR Temp[100];
|
|
// double ElapsedTime;
|
|
// TCHAR tmpbuf[128];
|
|
// COLORREF CurrentColor;
|
|
// HWND hEditBox;
|
|
// TCHAR TempString [50];
|
|
USER_DATA UserData;
|
|
BOOL bEOL = FALSE;
|
|
TCHAR AppNameFilter[MAX_PATH];
|
|
TCHAR AppVerFilter[MAX_PATH];
|
|
TCHAR ModNameFilter[MAX_PATH];
|
|
TCHAR ModVerFilter[MAX_PATH];
|
|
|
|
HWND hList = GetDlgItem(hwnd, IDC_USER_LIST);
|
|
ZeroMemory(&lvi, sizeof LVITEM);
|
|
ListView_DeleteAllItems(hList);
|
|
g_dwUmodeIndex = -1;
|
|
cUserData.ResetCurrPos();
|
|
|
|
|
|
BOOL bUseAppName = FALSE;
|
|
BOOL bUseAppVer = FALSE;
|
|
BOOL bUseModName = FALSE;
|
|
BOOL bUseModVer = FALSE;
|
|
|
|
HWND hAppName = GetDlgItem(hwnd, IDC_APPNAME_FILTER);
|
|
HWND hAppVer = GetDlgItem(hwnd, IDC_APPVER_FILTER);
|
|
HWND hModName = GetDlgItem(hwnd, IDC_MODNAME_FILTER);
|
|
HWND hModVer = GetDlgItem(hwnd, IDC_MODVER_FILTER);
|
|
|
|
int iAppNameSel = 0;
|
|
int iAppVerSel = 0;
|
|
int iModNameSel = 0;
|
|
int iModVerSel = 0;
|
|
|
|
iAppNameSel = ComboBox_GetCurSel(hAppName);
|
|
iAppVerSel = ComboBox_GetCurSel(hAppVer);
|
|
iModNameSel = ComboBox_GetCurSel(hModName);
|
|
iModVerSel = ComboBox_GetCurSel(hModVer);
|
|
g_iSelCurrent = -1;
|
|
// Get the current Filter Selection Strings.
|
|
if (iAppNameSel != 0)
|
|
{
|
|
bUseAppName = TRUE;
|
|
ComboBox_GetLBText(hAppName,iAppNameSel, AppNameFilter);
|
|
}
|
|
if (iAppVerSel != 0)
|
|
{
|
|
bUseAppVer = TRUE;
|
|
ComboBox_GetLBText(hAppVer,iAppVerSel, AppVerFilter);
|
|
}
|
|
if (iModNameSel != 0)
|
|
{
|
|
bUseModName = TRUE;
|
|
ComboBox_GetLBText(hModName,iModNameSel, ModNameFilter);
|
|
}
|
|
if (iModVerSel != 0)
|
|
{
|
|
bUseModVer = TRUE;
|
|
ComboBox_GetLBText(hModVer,iModVerSel, ModVerFilter);
|
|
}
|
|
|
|
while ( (cUserData.GetNextEntryNoMove(&UserData, &bEOL)) && (!bEOL) )
|
|
{
|
|
|
|
//Add filters here.
|
|
if (bUseAppName)
|
|
{
|
|
// only show entries with the selected application name
|
|
if (_tcscmp(AppNameFilter, UserData.AppName))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseAppVer)
|
|
{
|
|
if (_tcscmp(AppVerFilter, UserData.AppVer))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseModName)
|
|
{
|
|
if (_tcscmp(ModNameFilter, UserData.ModName))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
if (bUseModVer)
|
|
{
|
|
if (_tcscmp(ModVerFilter, UserData.ModVer))
|
|
{
|
|
// Nope continue on
|
|
goto SkipEntry;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
++g_dwUmodeIndex;
|
|
|
|
|
|
cUserData.SetIndex(g_dwUmodeIndex);
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM ;
|
|
|
|
/*if (g_dwUmodeIndex == 0)
|
|
{
|
|
lvi.state = LVIS_SELECTED | LVIS_FOCUSED;
|
|
lvi.stateMask = (UINT)-1;
|
|
UserListItemSelected = TRUE;
|
|
g_iSelCurrent = 0;
|
|
}
|
|
else
|
|
{
|
|
lvi.state= 0;
|
|
lvi.stateMask = 0;
|
|
}
|
|
*/
|
|
lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 0;
|
|
lvi.pszText = UserData.Status.BucketID;
|
|
lvi.lParam = g_dwUmodeIndex;
|
|
ListView_InsertItem(hList,&lvi);
|
|
|
|
lvi.mask = LVIF_TEXT ;
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 1;
|
|
lvi.pszText = UserData.AppName;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 2;
|
|
lvi.pszText = UserData.AppVer;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 3;
|
|
lvi.pszText = UserData.ModName ;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 4;
|
|
lvi.pszText = UserData.ModVer;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 5;
|
|
lvi.pszText = UserData.Offset;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 6;
|
|
lvi.pszText = UserData.Hits;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
lvi.iSubItem = 7;
|
|
lvi.pszText = UserData.Cabs;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
// lvi.iItem = g_dwUmodeIndex ;
|
|
|
|
lvi.iSubItem = 8;
|
|
lvi.pszText = UserData.CabCount;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
lvi.iSubItem = 9;
|
|
|
|
if ( (UserData.Status.GetFile[0] != _T('\0')) || (!_tcscmp(UserData.Status.fDoc, _T("1"))))
|
|
{
|
|
lvi.pszText=_T("Advanced"); // Advanced
|
|
}
|
|
else
|
|
{
|
|
if ( (UserData.Status.RegKey[0] != _T('\0')) ||
|
|
(UserData.Status.WQL[0] != _T('\0')) ||
|
|
(UserData.Status.GetFileVersion[0] != _T('\0')) ||
|
|
( !_tcscmp(UserData.Status.MemoryDump, _T("1"))) )
|
|
{
|
|
lvi.pszText=_T("Basic"); // Basic Collection
|
|
}
|
|
else
|
|
lvi.pszText = _T("");
|
|
}
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
lvi.iSubItem = 10;
|
|
|
|
|
|
lvi.pszText = _T("");
|
|
if (!_tcscmp(UserData.Status.SecondLevelData,_T("\0")))
|
|
{
|
|
// Use Global
|
|
if( (!_tcscmp(GlobalPolicy.AllowBasic, _T("NO"))) || (!_tcscmp(GlobalPolicy.AllowBasic, _T("\0"))) )
|
|
{
|
|
lvi.pszText=_T("Basic"); // basic
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((!_tcscmp(UserData.Status.SecondLevelData,_T("NO"))) || (!_tcscmp(UserData.Status.SecondLevelData,_T("\0"))) )
|
|
{
|
|
lvi.pszText=_T("Basic"); // basic
|
|
}
|
|
|
|
|
|
}
|
|
if ( !_tcscmp (UserData.Status.FileCollection, _T("\0")))
|
|
{
|
|
if ((!_tcscmp(GlobalPolicy.AllowAdvanced, _T("NO"))) || (!_tcscmp(GlobalPolicy.AllowAdvanced, _T("\0"))))
|
|
{
|
|
lvi.pszText=_T("Advanced"); // Advanced
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if ((!_tcscmp(UserData.Status.FileCollection,_T("NO")))|| (!_tcscmp(UserData.Status.FileCollection,_T("\0"))))
|
|
{
|
|
lvi.pszText=_T("Advanced"); // Advanced
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
if ( ((!_tcscmp(UserData.Status.FileCollection,_T("NO"))) || (!_tcscmp(UserData.Status.FileCollection,_T("\0")))) && ( (!_tcscmp(GlobalPolicy.AllowAdvanced, _T("NO"))) || (!_tcscmp(GlobalPolicy.AllowAdvanced, _T("\0")))) )
|
|
{
|
|
lvi.pszText=_T("Advanced"); // Advanced
|
|
}
|
|
else
|
|
{
|
|
if ( ( (!_tcscmp(UserData.Status.SecondLevelData,_T("NO"))) || (!_tcscmp(UserData.Status.SecondLevelData,_T("\0"))) ) && ( (!_tcscmp(GlobalPolicy.AllowBasic, _T("NO"))) || (!_tcscmp(GlobalPolicy.AllowBasic, _T("\0"))) ) )
|
|
{
|
|
lvi.pszText=_T("Basic"); // Advanced
|
|
}
|
|
}
|
|
*/
|
|
ListView_SetItem(hList,&lvi);
|
|
lvi.pszText = _T("");
|
|
|
|
if (_tcscmp(UserData.Status.Response, _T("1")) && _tcscmp(UserData.Status.Response, _T("\0")) )
|
|
{
|
|
lvi.iSubItem = 11;
|
|
lvi.pszText = UserData.Status.Response;
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
}
|
|
|
|
|
|
lvi.iSubItem = 12;
|
|
lvi.pszText = _T("");
|
|
if (_tcscmp(UserData.Status.UrlToLaunch, _T("\0")))
|
|
{
|
|
lvi.pszText = UserData.Status.UrlToLaunch ;
|
|
}
|
|
else
|
|
{
|
|
// try the default policy
|
|
lvi.pszText = GlobalPolicy.CustomURL;
|
|
}
|
|
ListView_SetItem(hList,&lvi);
|
|
|
|
SkipEntry:
|
|
cUserData.MoveNext(&bEOL);
|
|
}
|
|
|
|
|
|
SendMessage(GetDlgItem(hwnd,IDC_USER_EDIT ), WM_SETTEXT, NULL, (LPARAM)_T(""));
|
|
if (g_iSelCurrent == -1)
|
|
{
|
|
SendMessage(GetDlgItem(hwnd,IDC_NOTES ), WM_SETTEXT, NULL, (LPARAM)_T(""));
|
|
}
|
|
//DisplayUserBucketData(hwnd, g_iSelCurrent);
|
|
PopulateFiltersWSelection(hwnd);
|
|
//UserListItemSelected = FALSE;
|
|
}
|
|
BOOL VerifyFileAccess(TCHAR *szPath, BOOL fOptional)
|
|
{
|
|
HANDLE hFile = CreateFile(szPath, GENERIC_READ | GENERIC_WRITE | DELETE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
|
|
|
if ((hFile == INVALID_HANDLE_VALUE) && !((GetLastError() == ERROR_FILE_NOT_FOUND) ||(GetLastError() == ERROR_PATH_NOT_FOUND)))
|
|
{
|
|
MessageBox(NULL, _T("You do not have the required Administrative access to the selected CER file tree.\r\nAs a result, administrative options will be disabled."), NULL, MB_OK | MB_TASKMODAL);
|
|
g_bFirstBucket = FALSE;
|
|
return FALSE;
|
|
}
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
|
|
// Try to Create the Status.txt file
|
|
hFile = CreateFile(szPath, GENERIC_READ | GENERIC_WRITE | DELETE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
MessageBox(NULL, _T("You do not have the required Administrative access to the selected CER file tree.\r\nAs a result, administrative options will be disabled."), NULL, MB_OK | MB_TASKMODAL);
|
|
g_bFirstBucket = FALSE;
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
CloseHandle(hFile);
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
g_bFirstBucket = FALSE;
|
|
return TRUE;
|
|
}
|
|
}
|
|
g_bFirstBucket = FALSE;
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
CloseHandle(hFile);
|
|
return TRUE;
|
|
}
|
|
//////////////////////////////////////////////////////////////////
|
|
// Get user mode Data
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
BOOL ParseCountsFile(PUSER_DATA UserData)
|
|
{
|
|
FILE *pFile = NULL;
|
|
TCHAR Buffer[100];
|
|
TCHAR *Temp = NULL;
|
|
BOOL Status = TRUE;
|
|
ZeroMemory(Buffer,sizeof Buffer);
|
|
pFile = _tfopen(UserData->CountPath, _T("r"));
|
|
if (pFile)
|
|
{
|
|
// Get the Cabs Gathered Count
|
|
|
|
if (!_fgetts(Buffer, sizeof Buffer, pFile))
|
|
{
|
|
Status = FALSE;
|
|
goto ERRORS;
|
|
}
|
|
// Remove \r\n and
|
|
Temp = Buffer;
|
|
while ( (*Temp != _T('\r')) && (*Temp != _T('\n')) && (*Temp != _T('\0')) )
|
|
{
|
|
++Temp;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
Temp = _tcsstr(Buffer, _T("="));
|
|
if (Temp)
|
|
{
|
|
++Temp; // move path the = sign
|
|
if (StringCbCopy(UserData->Cabs, sizeof UserData->Cabs, Temp) != S_OK)
|
|
{
|
|
Status = FALSE;
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
|
|
// Get the Total Hits Count
|
|
ZeroMemory(Buffer,sizeof Buffer);
|
|
if (! _fgetts(Buffer, sizeof Buffer, pFile))
|
|
{
|
|
Status = FALSE;
|
|
goto ERRORS;
|
|
}
|
|
Temp = Buffer;
|
|
while ( (*Temp != _T('\r')) && (*Temp != _T('\n')) && (*Temp != _T('\0')) )
|
|
{
|
|
++Temp;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
Temp = _tcsstr(Buffer, _T("="));
|
|
if (Temp)
|
|
{
|
|
++Temp; // move path the = sign
|
|
if (StringCbCopy(UserData->Hits, sizeof UserData->Hits, Temp) != S_OK)
|
|
{
|
|
Status = FALSE;
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
fclose(pFile);
|
|
pFile = NULL;
|
|
Status = TRUE;
|
|
}
|
|
else
|
|
{
|
|
Status = FALSE;
|
|
}
|
|
|
|
pFile = NULL;
|
|
UserData->iReportedCount = 0;
|
|
pFile = _tfopen(UserData->ReportedCountPath, _T("r"));
|
|
if (pFile)
|
|
{
|
|
// Get the Cabs Gathered Count
|
|
ZeroMemory (Buffer,sizeof Buffer);
|
|
if (!_fgetts(Buffer, sizeof Buffer, pFile))
|
|
{
|
|
Status = FALSE;
|
|
goto ERRORS;
|
|
}
|
|
|
|
// Remove \r\n and
|
|
Temp = Buffer;
|
|
while ( (*Temp != _T('\r')) && (*Temp != _T('\n')) && (*Temp != _T('\0')) )
|
|
{
|
|
++Temp;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
Temp = _tcsstr(Buffer, _T("="));
|
|
if (Temp)
|
|
{
|
|
++Temp; // move past the = sign
|
|
UserData->iReportedCount = _ttoi (Temp);
|
|
}
|
|
|
|
|
|
fclose(pFile);
|
|
pFile = NULL;
|
|
Status = TRUE;
|
|
|
|
}
|
|
else
|
|
{
|
|
Status = FALSE;
|
|
}
|
|
ERRORS:
|
|
if (pFile)
|
|
{
|
|
fclose(pFile);
|
|
}
|
|
return Status;
|
|
|
|
}
|
|
|
|
BOOL ParseStatusFile(PUSER_DATA UserData)
|
|
{
|
|
FILE *pFile = NULL;
|
|
TCHAR Buffer[1024];
|
|
// TCHAR szTempDir[MAX_PATH];
|
|
TCHAR *Temp = NULL;
|
|
// int id = 0;
|
|
ZeroMemory(Buffer,sizeof Buffer);
|
|
|
|
|
|
pFile = _tfopen(UserData->StatusPath, _T("r"));
|
|
if (pFile)
|
|
{
|
|
|
|
// Get the Cabs Gathered Count
|
|
|
|
if (!_fgetts(Buffer, sizeof Buffer, pFile))
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
do
|
|
{
|
|
// Remove \r\n and force termination of the buffer.
|
|
Temp = Buffer;
|
|
while ( (*Temp != _T('\r')) && (*Temp != _T('\n')) && (*Temp != _T('\0')) )
|
|
{
|
|
++Temp;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
Temp = _tcsstr(Buffer, BUCKET_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(BUCKET_PREFIX);
|
|
if (StringCbCopy(UserData->Status.BucketID, sizeof UserData->Status.BucketID, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer,RESPONSE_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(RESPONSE_PREFIX);
|
|
if (StringCbCopy(UserData->Status.Response, sizeof UserData->Status.Response, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, URLLAUNCH_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(URLLAUNCH_PREFIX);
|
|
if (StringCbCopy(UserData->Status.UrlToLaunch , sizeof UserData->Status.UrlToLaunch , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, SECOND_LEVEL_DATA_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(SECOND_LEVEL_DATA_PREFIX);
|
|
if (StringCbCopy(UserData->Status.SecondLevelData , sizeof UserData->Status.SecondLevelData , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, TRACKING_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(TRACKING_PREFIX);
|
|
if (StringCbCopy(UserData->Status.Tracking , sizeof UserData->Status.Tracking , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, CRASH_PERBUCKET_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(CRASH_PERBUCKET_PREFIX);
|
|
if (StringCbCopy(UserData->Status.CrashPerBucketCount , sizeof UserData->Status.CrashPerBucketCount , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, FILE_COLLECTION_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FILE_COLLECTION_PREFIX);
|
|
if (StringCbCopy(UserData->Status.FileCollection , sizeof UserData->Status.FileCollection, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, REGKEY_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(REGKEY_PREFIX);
|
|
if (StringCbCopy(UserData->Status.RegKey , sizeof UserData->Status.RegKey , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, FDOC_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FDOC_PREFIX);
|
|
if (StringCbCopy(UserData->Status.fDoc , sizeof UserData->Status.fDoc , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, IDATA_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(IDATA_PREFIX);
|
|
if (StringCbCopy(UserData->Status.iData , sizeof UserData->Status.iData , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, WQL_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(WQL_PREFIX);
|
|
if (StringCbCopy(UserData->Status.WQL , sizeof UserData->Status.WQL , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, GETFILE_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(GETFILE_PREFIX);
|
|
if (StringCbCopy(UserData->Status.GetFile , sizeof UserData->Status.GetFile, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, GETFILEVER_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(GETFILEVER_PREFIX);
|
|
if (StringCbCopy(UserData->Status.GetFileVersion , sizeof UserData->Status.GetFileVersion , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, MEMDUMP_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(MEMDUMP_PREFIX);
|
|
if (StringCbCopy(UserData->Status.MemoryDump , sizeof UserData->Status.MemoryDump, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, ALLOW_EXTERNAL_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(ALLOW_EXTERNAL_PREFIX);
|
|
if (StringCbCopy(UserData->Status.AllowResponse , sizeof UserData->Status.AllowResponse, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
ZeroMemory(Buffer, sizeof Buffer);
|
|
} while (_fgetts(Buffer, sizeof Buffer, pFile));
|
|
fclose(pFile);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
ERRORS:
|
|
if (pFile)
|
|
{
|
|
fclose(pFile);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CreateStatusDir(TCHAR *szPath)
|
|
{
|
|
if (!PathIsDirectory(szPath))
|
|
return CreateDirectory(szPath,NULL);
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL IsHexDigit(TCHAR Digit)
|
|
{
|
|
if ((_T('0') <= Digit && Digit <= _T('9')) ||
|
|
(_T('A') <= Digit && Digit <= _T('F')) ||
|
|
(_T('a') <= Digit && Digit <= _T('f')))
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
BOOL GetBucketData(HWND hwnd, TCHAR *FilePath, int iLevel)
|
|
/*
|
|
Recursively process the user mode filetree schema
|
|
|
|
*/
|
|
{
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE hFind = INVALID_HANDLE_VALUE;
|
|
TCHAR szSubPath [MAX_PATH];
|
|
TCHAR szSearchPath[MAX_PATH];
|
|
TCHAR szTempDir[MAX_PATH];
|
|
PUSER_DATA NewNode = NULL;
|
|
TCHAR *Temp;
|
|
HANDLE hCabFind = INVALID_HANDLE_VALUE;
|
|
WIN32_FIND_DATA CabFindData;
|
|
// TCHAR szPolicyFilePath[MAX_PATH];
|
|
int iCabCount;
|
|
if (iLevel != OFFSET)
|
|
{
|
|
if (StringCbPrintf(szSearchPath,sizeof szSearchPath, _T("%s\\*.*"), FilePath) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbPrintf(szSearchPath,sizeof szSearchPath, _T("%s\\*.cab"), FilePath) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
if (iLevel < OFFSET)
|
|
{
|
|
hFind = FindFirstFile(szSearchPath, &FindData);
|
|
if ( hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
// find the next directory
|
|
// skip the . and ..
|
|
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// recursively call ourselves with the level incremented.
|
|
if ( (_tcscmp(FindData.cFileName, _T("."))) && (_tcscmp(FindData.cFileName, _T(".."))) )
|
|
{
|
|
if (StringCbPrintf( szSubPath,
|
|
sizeof szSubPath,
|
|
_T("%s\\%s"),
|
|
FilePath,
|
|
FindData.cFileName) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
GetBucketData(hwnd, szSubPath, iLevel+1);
|
|
}
|
|
}
|
|
}while (FindNextFile(hFind, &FindData));
|
|
FindClose(hFind);
|
|
hFind = INVALID_HANDLE_VALUE;
|
|
}
|
|
else
|
|
{
|
|
// This is an invalid case
|
|
// we are done with this tree segment
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
|
|
if (iLevel == OFFSET)
|
|
{
|
|
// Verify that this directory name meets the OFFSET criteria
|
|
Temp = FilePath + _tcslen(FilePath) * sizeof TCHAR;
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
if ( (_tcslen(Temp+1) == 8) || (_tcslen(Temp+1) == 16) )
|
|
{
|
|
// The string should be hex
|
|
for (UINT i = 0; i < _tcslen(Temp+1); i++)
|
|
{
|
|
if (!IsHexDigit(Temp[i+1]))
|
|
{
|
|
goto DONE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Failed
|
|
goto DONE;
|
|
}
|
|
/* if ( !IsStringHexDigits (Temp))
|
|
{
|
|
// Nope
|
|
goto DONE;
|
|
}
|
|
*/
|
|
// If we made it here we are calling it good.
|
|
|
|
// We should now be at a leaf node.
|
|
NewNode = (PUSER_DATA) malloc (sizeof (USER_DATA));
|
|
|
|
// Now we need to parse the path into it's component parts
|
|
if (!NewNode )
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
ZeroMemory(NewNode, sizeof USER_DATA);
|
|
|
|
if (StringCbCopy(NewNode->BucketPath, sizeof NewNode->BucketPath, FilePath)!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Temp = FilePath + _tcslen(FilePath) * sizeof TCHAR;
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
// Copy Temp+1 into Offset
|
|
if (StringCbCopy(NewNode->Offset, sizeof NewNode->Offset, Temp+1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
if (_tcslen (NewNode->Offset) == 16)
|
|
{
|
|
NewNode->Is64Bit = TRUE;
|
|
}
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
if (StringCbCopy(NewNode->ModVer, sizeof NewNode->ModVer, Temp+1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
if (StringCbCopy(NewNode->ModName, sizeof NewNode->ModName, Temp+1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
*Temp = _T('\0');
|
|
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
if (StringCbCopy(NewNode->AppVer, sizeof NewNode->AppVer, Temp+1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
*Temp = _T('\0');
|
|
|
|
while ((*Temp != _T('\\')))
|
|
{
|
|
--Temp;
|
|
}
|
|
if (StringCbCopy(NewNode->AppName, sizeof NewNode->AppName, Temp+1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
// MessageBox(NULL, NewNode->AppName, "AddingNode",MB_OK);
|
|
|
|
// Count the number of unprocessed cabs.
|
|
iCabCount = 0;
|
|
hCabFind = FindFirstFile(szSearchPath, &CabFindData);
|
|
if (hCabFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
++iCabCount;
|
|
}
|
|
while (FindNextFile(hCabFind, &FindData));
|
|
FindClose (hCabFind);
|
|
}
|
|
else
|
|
{
|
|
iCabCount = 0;
|
|
}
|
|
|
|
_itot(iCabCount, NewNode->CabCount, 10);
|
|
|
|
// Read the status.txt file for each entry in the Data Structure ?
|
|
// Build path to Status file
|
|
if (StringCbPrintf(NewNode->StatusPath,
|
|
sizeof NewNode->StatusPath,
|
|
_T("%s\\Status\\%s\\%s\\%s\\%s\\%s\\Status.txt"),
|
|
CerRoot,
|
|
NewNode->AppName,
|
|
NewNode->AppVer,
|
|
NewNode->ModName,
|
|
NewNode->ModVer,
|
|
NewNode->Offset
|
|
) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
if (StringCbPrintf(szTempDir,
|
|
sizeof szTempDir,
|
|
_T("%s\\Status\\%s\\%s\\%s\\%s\\%s"),
|
|
CerRoot,
|
|
NewNode->AppName,
|
|
NewNode->AppVer,
|
|
NewNode->ModName,
|
|
NewNode->ModVer,
|
|
NewNode->Offset
|
|
) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
if (!PathIsDirectory(szTempDir))
|
|
{
|
|
// Let's create it
|
|
if (StringCbPrintf(szTempDir,
|
|
sizeof szTempDir,
|
|
_T("%s\\Status"),CerRoot)!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
if (CreateStatusDir(szTempDir))
|
|
{
|
|
// Next
|
|
if (StringCbCat(szTempDir, sizeof szTempDir,_T("\\")) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szTempDir, sizeof szTempDir, NewNode->AppName) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (CreateStatusDir(szTempDir))
|
|
{
|
|
if (StringCbCat(szTempDir, sizeof szTempDir,_T("\\")) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szTempDir, sizeof szTempDir, NewNode->AppVer) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (CreateStatusDir(szTempDir))
|
|
{
|
|
if (StringCbCat(szTempDir, sizeof szTempDir,_T("\\")) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szTempDir, sizeof szTempDir, NewNode->ModName) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (CreateStatusDir(szTempDir))
|
|
{
|
|
if (StringCbCat(szTempDir, sizeof szTempDir,_T("\\")) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szTempDir, sizeof szTempDir, NewNode->ModVer) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (CreateStatusDir(szTempDir))
|
|
{
|
|
if (StringCbCat(szTempDir, sizeof szTempDir,_T("\\")) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szTempDir, sizeof szTempDir, NewNode->Offset) !=S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
CreateStatusDir(szTempDir);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
//Verify That we can create and delete a file from the status directory
|
|
if (g_bFirstBucket)
|
|
{
|
|
// Build the file name
|
|
if (!VerifyFileAccess(NewNode->StatusPath, FALSE))
|
|
{
|
|
g_bAdminAccess = FALSE;
|
|
}
|
|
}
|
|
ParseStatusFile(NewNode);
|
|
|
|
// Read the counts file for each entry in the data structure. ?
|
|
// Build path to counts file
|
|
if (StringCbPrintf(NewNode->CountPath,
|
|
sizeof NewNode->CountPath,
|
|
_T("%s\\Counts\\%s\\%s\\%s\\%s\\%s\\count.txt"),
|
|
CerRoot,
|
|
NewNode->AppName,
|
|
NewNode->AppVer,
|
|
NewNode->ModName,
|
|
NewNode->ModVer,
|
|
NewNode->Offset
|
|
) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
if (StringCbPrintf(NewNode->ReportedCountPath,
|
|
sizeof NewNode->ReportedCountPath,
|
|
_T("%s\\Counts\\%s\\%s\\%s\\%s\\%s\\RepCounts.txt"),
|
|
CerRoot,
|
|
NewNode->AppName,
|
|
NewNode->AppVer,
|
|
NewNode->ModName,
|
|
NewNode->ModVer,
|
|
NewNode->Offset
|
|
) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
ParseCountsFile(NewNode);
|
|
// Update the linked list
|
|
cUserData.AddNode(NewNode);
|
|
// Update Progress Bar
|
|
|
|
//if (Pos == 99)
|
|
//{
|
|
// SendDlgItemMessage(hwnd, IDC_LOADPB, PBM_SETPOS,
|
|
}
|
|
DONE:
|
|
--iLevel;
|
|
|
|
return TRUE; // Prefix Note: This is not a memory leak the node will be freed when the
|
|
// linked list is freed in the cUserData destructor
|
|
ERRORS:
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
FindClose(hFind);
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
BOOL ParsePolicy( TCHAR *Path, PUSER_DATA pUserData, BOOL Global)
|
|
{
|
|
// Same basic parsing of Status file
|
|
// Will cleanup at a later date.
|
|
FILE *pFile = NULL;
|
|
TCHAR Buffer[MAX_PATH + 10];
|
|
// TCHAR szTempDir[MAX_PATH];
|
|
TCHAR *Temp = NULL;
|
|
// int id = 0;
|
|
ZeroMemory(Buffer,sizeof Buffer);
|
|
ZeroMemory(&GlobalPolicy, sizeof GLOBAL_POLICY);
|
|
|
|
pFile = _tfopen(Path, _T("r"));
|
|
if (pFile)
|
|
{
|
|
|
|
// Get the Cabs Gathered Count
|
|
|
|
if (!_fgetts(Buffer, sizeof Buffer, pFile))
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
do
|
|
{
|
|
// Remove \r\n and force termination of the buffer.
|
|
Temp = Buffer;
|
|
while ( (*Temp != _T('\r')) && (*Temp != _T('\n')) && (*Temp != _T('\0')) )
|
|
{
|
|
++Temp;
|
|
}
|
|
*Temp = _T('\0');
|
|
|
|
Temp = _tcsstr(Buffer, URLLAUNCH_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(URLLAUNCH_PREFIX);
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.CustomURL , sizeof GlobalPolicy.CustomURL , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.CustomURL , sizeof pUserData->Policy.CustomURL , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, SECOND_LEVEL_DATA_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(SECOND_LEVEL_DATA_PREFIX);
|
|
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.AllowBasic , sizeof GlobalPolicy.AllowBasic , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.AllowBasic , sizeof pUserData->Policy.AllowBasic , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, FILE_COLLECTION_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FILE_COLLECTION_PREFIX);
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.AllowAdvanced , sizeof GlobalPolicy.AllowAdvanced, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.AllowAdvanced , sizeof pUserData->Policy.AllowAdvanced, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
|
|
Temp = _tcsstr(Buffer, TRACKING_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(TRACKING_PREFIX);
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.EnableCrashTracking , sizeof GlobalPolicy.EnableCrashTracking , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.EnableCrashTracking , sizeof pUserData->Policy.EnableCrashTracking , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, CRASH_PERBUCKET_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(CRASH_PERBUCKET_PREFIX);
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.CabsPerBucket , sizeof GlobalPolicy.CabsPerBucket , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.CabsPerBucket , sizeof pUserData->Policy.CabsPerBucket , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, ALLOW_EXTERNAL_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(ALLOW_EXTERNAL_PREFIX);
|
|
if (Global)
|
|
{
|
|
if (StringCbCopy(GlobalPolicy.AllowMicrosoftResponse , sizeof GlobalPolicy.AllowMicrosoftResponse , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(pUserData->Policy.AllowMicrosoftResponse , sizeof pUserData->Policy.AllowMicrosoftResponse , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (Global) // This entry is not available on a per bucket basis.
|
|
{
|
|
Temp = _tcsstr(Buffer, FILE_TREE_ROOT_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FILE_TREE_ROOT_PREFIX);
|
|
if (StringCbCopy(GlobalPolicy.RedirectFileServer , sizeof GlobalPolicy.RedirectFileServer , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
ZeroMemory(Buffer, sizeof Buffer);
|
|
} while (_fgetts(Buffer, sizeof Buffer, pFile));
|
|
fclose(pFile);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
ERRORS:
|
|
if (pFile)
|
|
{
|
|
fclose(pFile);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GetAllBuckets(HWND hwnd)
|
|
{
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE hFind = INVALID_HANDLE_VALUE;
|
|
TCHAR szSearchPattern[MAX_PATH];
|
|
TCHAR szSubPath[MAX_PATH];
|
|
int iDirCount = 0;
|
|
TCHAR PolicyPath[MAX_PATH];
|
|
|
|
|
|
// Parse the global Policy
|
|
if (StringCbPrintf(PolicyPath, sizeof PolicyPath,_T("%s\\policy.txt"), CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
ParsePolicy(PolicyPath,
|
|
NULL, // Use the Global Policy Structure.
|
|
TRUE); // Set to true if Global policy False = selected.
|
|
|
|
// Start with a clean Linked List.
|
|
cUserData.CleanupList();
|
|
if (StringCbPrintf(szSearchPattern,sizeof szSearchPattern,_T("%s\\cabs\\*.*"), CerRoot) != S_OK)
|
|
{
|
|
|
|
; // Need to define error case handling code here.
|
|
}
|
|
// Count all the directories and set the progress bar range.
|
|
hFind = FindFirstFile(szSearchPattern, &FindData);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// skip the . and .. directories.
|
|
if ( (_tcscmp(FindData.cFileName, _T("."))) && (_tcscmp(FindData.cFileName, _T(".."))) )
|
|
{
|
|
++iDirCount;
|
|
}
|
|
}
|
|
} while (FindNextFile(hFind, &FindData));
|
|
FindClose (hFind);
|
|
hFind = INVALID_HANDLE_VALUE;
|
|
//if (iDirCount > 100)
|
|
//iDirCount = 100;
|
|
// SetDlgItemText(hwnd, IDC_STATIC1, _T("Reading current status of user mode tree..."));
|
|
SendDlgItemMessage(hwnd, IDC_LOADPB, PBM_SETRANGE, 0, MAKELPARAM(0, iDirCount));
|
|
SendDlgItemMessage(hwnd, IDC_LOADPB, PBM_SETSTEP, 1, 0);
|
|
|
|
}
|
|
else
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
hFind = FindFirstFile(szSearchPattern, &FindData);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
|
|
if ( hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
// skip the . and .. directories.
|
|
if ( (_tcscmp(FindData.cFileName, _T("."))) && (_tcscmp(FindData.cFileName, _T(".."))) )
|
|
{
|
|
// now skip the blue shutdown and appcompat
|
|
if (_tcscmp(FindData.cFileName, _T("blue")) &&
|
|
_tcscmp(FindData.cFileName, _T("shutdown")) &&
|
|
_tcscmp(FindData.cFileName, _T("appcompat")) )
|
|
{
|
|
if (StringCbPrintf(szSubPath, sizeof szSubPath, _T("%s\\cabs\\%s"), CerRoot, FindData.cFileName)!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
SetDlgItemText(hwnd, IDC_SUBDIR, szSubPath);
|
|
GetBucketData(hwnd, szSubPath, APPNAME);
|
|
SendDlgItemMessage(hwnd,IDC_LOADPB, PBM_STEPIT, 0,0);
|
|
}
|
|
}
|
|
}
|
|
}while (FindNextFile(hFind, &FindData));
|
|
FindClose(hFind);
|
|
hFind = INVALID_HANDLE_VALUE;
|
|
}
|
|
}
|
|
PopulateFilters(hUserMode);
|
|
return TRUE;
|
|
ERRORS:
|
|
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
FindClose(hFind);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void
|
|
OnUserContextMenu(HWND hwnd,
|
|
LPARAM lParam )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Loads and provides a message pump for the User mode context menu
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Kernel mode dialog box
|
|
lParam - Not Used
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
BOOL Result = FALSE;
|
|
HMENU hMenu = NULL;
|
|
HMENU hmenuPopup = NULL;
|
|
|
|
int xPos, yPos;
|
|
hMenu = LoadMenu(g_hinst, MAKEINTRESOURCE( IDR_USERCONTEXT));
|
|
hmenuPopup = GetSubMenu (hMenu,0);
|
|
if (!hmenuPopup)
|
|
{
|
|
//MessageBox(NULL,"Failed to get sub item", NULL,MB_OK);
|
|
;
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
// Grey out the menu items
|
|
EnableMenuItem (hMenu, ID_REPORT_ALL, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLUSERMODEFAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_SELECTEDBUCKET, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_MICROSOFTRESPONSE, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETOVERRIDERESPONSE155, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH140, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH121, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_CRASHLOG, MF_BYCOMMAND| MF_GRAYED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_COPY144, MF_BYCOMMAND| MF_GRAYED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_DEFAULTREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_USERMODEREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_SELECTEDBUCKETREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
//EnableMenuItem (hMenu, ID_EXPORT_USERMODEFAULTDATA174, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETCABFILEDIRECTORY157, MF_BYCOMMAND| MF_GRAYED);
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
|
|
EnableMenuItem (hMenu, ID_REPORT_ALL, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLUSERMODEFAULTS, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_REPORT_SELECTEDBUCKET, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_MICROSOFTRESPONSE, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETOVERRIDERESPONSE155, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH140, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH121, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_CRASHLOG, MF_BYCOMMAND| MF_ENABLED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_COPY144, MF_BYCOMMAND| MF_ENABLED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_DEFAULTREPORTINGOPTIONS, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_EDIT_USERMODEREPORTINGOPTIONS, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_EDIT_SELECTEDBUCKETREPORTINGOPTIONS, MF_BYCOMMAND| MF_ENABLED);
|
|
//EnableMenuItem (hMenu, ID_EXPORT_USERMODEFAULTDATA174, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETCABFILEDIRECTORY157, MF_BYCOMMAND| MF_ENABLED);
|
|
if ( !g_bAdminAccess)
|
|
{
|
|
EnableMenuItem (hMenu, ID_REPORT_ALL, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLUSERMODEFAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_SELECTEDBUCKET, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_USERMODEREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_SELECTEDBUCKETREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
}
|
|
|
|
|
|
}
|
|
xPos = GET_X_LPARAM(lParam);
|
|
yPos = GET_Y_LPARAM(lParam);
|
|
Result = TrackPopupMenu (hmenuPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, xPos,yPos,0,hwnd,NULL);
|
|
|
|
}
|
|
if (hMenu)
|
|
DestroyMenu(hMenu);
|
|
}
|
|
|
|
void ViewResponse(HWND hwnd, BOOL bMSResponse)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Launches the system default Web browser useing shellexec
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Kernel mode dialog box
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
TCHAR Url [255];
|
|
HWND hList = GetDlgItem(hwnd, IDC_USER_LIST);
|
|
int sel;
|
|
// LVITEM lvi;
|
|
if (!hList)
|
|
return;
|
|
ZeroMemory (Url, sizeof Url);
|
|
|
|
sel = ListView_GetNextItem(hList,-1, LVNI_SELECTED);
|
|
// Now get the lParam for this item
|
|
if (bMSResponse)
|
|
{
|
|
ListView_GetItemText(hList, sel,11, Url,sizeof Url);
|
|
}
|
|
else
|
|
{
|
|
ListView_GetItemText(hList, sel,12, Url,sizeof Url);
|
|
}
|
|
if ( (!_tcsncicmp(Url, _T("http://"), _tcslen(_T("http://")))) || (!_tcsncicmp(Url, _T("https://"), _tcslen(_T("https://")))) )
|
|
{
|
|
SHELLEXECUTEINFOA sei = {0};
|
|
sei.cbSize = sizeof(sei);
|
|
sei.lpFile = Url;
|
|
sei.nShow = SW_SHOWDEFAULT;
|
|
if (! ShellExecuteEx(&sei) )
|
|
{
|
|
// What do we display here.
|
|
;
|
|
}
|
|
}
|
|
|
|
}
|
|
void ErrorLoadTree()
|
|
{
|
|
MessageBox(NULL, _T("To complete the requested operation you must first load a file tree"), NULL,MB_OK);
|
|
}
|
|
|
|
void ViewBucketDir(HWND hwnd)
|
|
{
|
|
|
|
TCHAR szPath[MAX_PATH];
|
|
// TCHAR TempBuffer[MAX_PATH];
|
|
PUSER_DATA pUserData;
|
|
LVITEM lvi;
|
|
int sel;
|
|
|
|
HWND hList = GetDlgItem(hwnd, IDC_USER_LIST);
|
|
sel = ListView_GetNextItem(hList,-1, LVNI_SELECTED);
|
|
lvi.iItem = sel;
|
|
lvi.mask = LVIF_PARAM;
|
|
ListView_GetItem(hList, &lvi);
|
|
sel = lvi.lParam;
|
|
pUserData = cUserData.GetEntry(sel);
|
|
if (pUserData)
|
|
{
|
|
if (StringCbPrintf(szPath, sizeof szPath, _T("%s\\cabs\\%s\\%s\\%s\\%s\\%s"),
|
|
CerRoot,
|
|
pUserData->AppName,
|
|
pUserData->AppVer,
|
|
pUserData->ModName,
|
|
pUserData->ModVer,
|
|
pUserData->Offset) != S_OK)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
SHELLEXECUTEINFOA sei = {0};
|
|
sei.cbSize = sizeof(sei);
|
|
sei.lpFile = szPath;
|
|
sei.nShow = SW_SHOWDEFAULT;
|
|
if (! ShellExecuteEx(&sei) )
|
|
{
|
|
// What do we display here.
|
|
;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL WriteNotesFile(HWND hwnd)
|
|
{
|
|
TCHAR szNotesPath[MAX_PATH];
|
|
// TCHAR TempBuffer[MAX_PATH];
|
|
PUSER_DATA pUserData;
|
|
// int sel;
|
|
TCHAR *Buffer = NULL;
|
|
DWORD dwBufferSize = 100000; // 100000 bytes or 50K Unicode characters
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR *Temp = NULL;
|
|
Buffer = (TCHAR *) malloc (dwBufferSize);
|
|
if (!Buffer)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
ZeroMemory(Buffer,dwBufferSize);
|
|
DWORD dwBytesWritten = 0;
|
|
|
|
// Get current notes file text
|
|
GetDlgItemText(hwnd, IDC_NOTES, Buffer, dwBufferSize / sizeof TCHAR - sizeof TCHAR);
|
|
|
|
// Get Current selected item Index
|
|
pUserData = cUserData.GetEntry(g_iSelCurrent);
|
|
if (pUserData)
|
|
{
|
|
|
|
if (StringCbCopy(szNotesPath, sizeof szNotesPath, pUserData->StatusPath)!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Temp = _tcsstr(szNotesPath, _T("Status.txt"));
|
|
if (!Temp)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
*Temp = _T('\0');
|
|
if (StringCbCat(szNotesPath, sizeof szNotesPath, _T("Notes.txt")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
hFile = CreateFile(szNotesPath, GENERIC_WRITE, NULL,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
WriteFile(hFile, Buffer, _tcslen(Buffer)*sizeof TCHAR, &dwBytesWritten, NULL);
|
|
}
|
|
CloseHandle(hFile);
|
|
}
|
|
|
|
}
|
|
if (g_iSelCurrent == -1)
|
|
{
|
|
SendMessage(GetDlgItem(hwnd,IDC_NOTES ), WM_SETTEXT, NULL, (LPARAM)_T(""));
|
|
}
|
|
//SetWindowText(GetDlgItem(hwnd,IDC_NOTES ),_T(""));
|
|
ERRORS:
|
|
if (Buffer)
|
|
free(Buffer);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DisplayUserBucketData(HWND hwnd, int iItem)
|
|
{
|
|
HWND hEditBox = GetDlgItem(hwnd, IDC_USER_EDIT);
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
TCHAR NotesFilePath[MAX_PATH];
|
|
PUSER_DATA pUserData = NULL;
|
|
TCHAR *Temp = NULL;
|
|
DWORD dwBytesRead = 0;
|
|
TCHAR *Source = NULL;
|
|
TCHAR *Dest = NULL;
|
|
TCHAR TempBuffer[1000];
|
|
TCHAR *Buffer = NULL; // we have to use a dynamic buffer since we don't
|
|
// have a clue as to the text length.
|
|
DWORD BufferLength = 100000; // 100k bytes should be plenty. or 50K unicode chars.
|
|
|
|
Buffer = (TCHAR *) malloc (BufferLength);
|
|
if (Buffer)
|
|
{
|
|
ZeroMemory(Buffer,BufferLength);
|
|
if (g_iSelCurrent == -1)
|
|
{
|
|
SendMessage(GetDlgItem(hwnd,IDC_NOTES ), WM_SETTEXT, NULL, (LPARAM)_T(""));
|
|
}
|
|
//SetWindowText(GetDlgItem(hwnd,IDC_NOTES ),_T(""));
|
|
|
|
pUserData = cUserData.GetEntry(iItem);
|
|
if (pUserData)
|
|
{
|
|
// Build the strings for the Edit box.
|
|
|
|
// Basic data collection first.
|
|
if ( (!_tcscmp (pUserData->Status.SecondLevelData, _T("YES"))) && (_tcscmp(pUserData->Status.FileCollection, _T("YES"))) )
|
|
{
|
|
if (StringCbPrintf(Buffer, BufferLength, _T("The following information will be sent to Microsoft.\r\n\tHowever, this bucket's policy would prevent files and user documents from being reported.\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
{
|
|
|
|
if ( !_tcscmp (pUserData->Status.SecondLevelData, _T("YES")))
|
|
{
|
|
if (StringCbPrintf(Buffer, BufferLength, _T("Microsoft would like to collect the following information but the default policy prevents the exchange.\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (!_tcscmp(pUserData->Status.FileCollection, _T("YES")))
|
|
{
|
|
if (StringCbCat(Buffer,BufferLength, _T(" Microsoft would like to collect the following information but default policy\r\n\tprevents files and user documents from being reported.\r\n\t As a result, no exchange will take place.\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (StringCbPrintf(Buffer, BufferLength, _T("The following information will be sent to Microsoft:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_tcscmp(pUserData->Status.GetFile, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("These files:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Source = pUserData->Status.GetFile;
|
|
|
|
while ((*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n')) )
|
|
{
|
|
ZeroMemory (TempBuffer, sizeof TempBuffer);
|
|
Dest = TempBuffer;
|
|
while ( (*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n'))&& (*Source != _T(';') ))
|
|
{
|
|
*Dest = *Source;
|
|
++Dest;
|
|
++Source;
|
|
}
|
|
if (*Source == _T(';'))
|
|
{
|
|
++Source;
|
|
}
|
|
*Dest =_T('\0');
|
|
if (StringCbCat(Dest, sizeof TempBuffer, _T("\r\n")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, _T("\t") )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, TempBuffer )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
if (_tcscmp(pUserData->Status.RegKey, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("These Registry Keys:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
Source = pUserData->Status.RegKey;
|
|
|
|
while ((*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n')) )
|
|
{
|
|
ZeroMemory (TempBuffer, sizeof TempBuffer);
|
|
Dest = TempBuffer;
|
|
while ( (*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n'))&& (*Source != _T(';') ))
|
|
{
|
|
*Dest = *Source;
|
|
++Dest;
|
|
++Source;
|
|
}
|
|
if (*Source == _T(';'))
|
|
{
|
|
++Source;
|
|
}
|
|
*Dest =_T('\0');
|
|
if (StringCbCat(Dest, sizeof TempBuffer, _T("\r\n")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, _T("\t") )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, TempBuffer )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
if (_tcscmp(pUserData->Status.WQL, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The Results of these WQL queries:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
// Replace ; with \t\r\n
|
|
|
|
|
|
Source = pUserData->Status.WQL;
|
|
|
|
while ((*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n')) )
|
|
{
|
|
ZeroMemory (TempBuffer, sizeof TempBuffer);
|
|
Dest = TempBuffer;
|
|
while ( (*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n'))&& (*Source != _T(';') ))
|
|
{
|
|
*Dest = *Source;
|
|
++Dest;
|
|
++Source;
|
|
}
|
|
if (*Source == _T(';'))
|
|
{
|
|
++Source;
|
|
}
|
|
*Dest =_T('\0');
|
|
if (StringCbCat(Dest, sizeof TempBuffer, _T("\r\n")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, _T("\t") )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, TempBuffer )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!_tcscmp (pUserData->Status.MemoryDump, _T("1")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The contents of global memory\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
if (_tcscmp(pUserData->Status.GetFileVersion, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The versions of these files:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Source = pUserData->Status.GetFileVersion;
|
|
|
|
while ((*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n')) )
|
|
{
|
|
ZeroMemory (TempBuffer, sizeof TempBuffer);
|
|
Dest = TempBuffer;
|
|
while ( (*Source != _T('\0')) && (*Source != _T('\r')) && (*Source != _T('\n'))&& (*Source != _T(';') ))
|
|
{
|
|
*Dest = *Source;
|
|
++Dest;
|
|
++Source;
|
|
}
|
|
if (*Source == _T(';'))
|
|
{
|
|
++Source;
|
|
}
|
|
*Dest =_T('\0');
|
|
if (StringCbCat(Dest, sizeof TempBuffer, _T("\r\n")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, _T("\t") )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(Buffer, BufferLength, TempBuffer )!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!_tcscmp(pUserData->Status.fDoc, _T("1")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The users current document.\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
SendMessage(hEditBox, WM_SETTEXT, NULL, (LPARAM)Buffer);
|
|
|
|
|
|
// Now display the Notes file
|
|
// Use the same buffer. Just truncate if it doesn't fit
|
|
ZeroMemory(Buffer, BufferLength);
|
|
|
|
if (StringCbCopy(NotesFilePath, sizeof NotesFilePath, pUserData->StatusPath)!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Temp = _tcsstr(NotesFilePath, _T("Status.txt"));
|
|
if (!Temp)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
*Temp = _T('\0');
|
|
if (StringCbCat(NotesFilePath, sizeof NotesFilePath, _T("Notes.txt")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
hFile = CreateFile(NotesFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
if (ReadFile(hFile, Buffer, BufferLength - sizeof TCHAR, &dwBytesRead, NULL))
|
|
{
|
|
SendMessage(GetDlgItem(hwnd,IDC_NOTES ), WM_SETTEXT, NULL, (LPARAM) Buffer);
|
|
|
|
}
|
|
CloseHandle (hFile);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
ERRORS:
|
|
if (Buffer)
|
|
free(Buffer);
|
|
return TRUE;
|
|
}
|
|
/*
|
|
void UMCopyToClipboard(HWND hwnd )
|
|
{
|
|
if (!OpenClipboard(NULL))
|
|
return;
|
|
|
|
EmptyClipboard();
|
|
char rtfRowHeader[sizeof(rtfRowHeader1) + (sizeof(rtfRowHeader2)+6)*USER_COL_COUNT + sizeof(rtfRowHeader3)];
|
|
char *rtfWalk = rtfRowHeader;
|
|
memcpy(rtfWalk, rtfRowHeader1, sizeof(rtfRowHeader1));
|
|
rtfWalk += sizeof(rtfRowHeader1)-1;
|
|
DWORD cxTotal = 0;
|
|
for(int i=0;i<USER_COL_COUNT;i++)
|
|
{
|
|
LVCOLUMNA lv;
|
|
lv.mask = LVCF_WIDTH;
|
|
lv.iSubItem = i;
|
|
SendMessageA(GetDlgItem(hwnd,IDC_USER_LIST), LVM_GETCOLUMN, i, (LPARAM)&lv);
|
|
cxTotal += lv.cx;
|
|
wsprintf(rtfWalk, "%s%d", rtfRowHeader2, cxTotal);
|
|
while(*++rtfWalk)
|
|
;
|
|
};
|
|
memcpy(rtfWalk, rtfRowHeader3, sizeof(rtfRowHeader3));
|
|
DWORD crtfHeader = strlen(rtfRowHeader);
|
|
DWORD crtf = 0, cwz = 0;
|
|
|
|
crtf += sizeof(rtfPrologue)-1;
|
|
|
|
int iSel = -1;
|
|
while ((iSel = SendMessageW(GetDlgItem(hwnd,IDC_USER_LIST), LVM_GETNEXTITEM, iSel, MAKELPARAM(LVNI_SELECTED, 0))) != -1)
|
|
{
|
|
crtf += crtfHeader;
|
|
for(int i=0;i<USER_COL_COUNT;i++)
|
|
{
|
|
WCHAR wzBuffer[1024];
|
|
LVITEMW lv;
|
|
|
|
lv.pszText = wzBuffer;
|
|
lv.cchTextMax = sizeof(wzBuffer);
|
|
lv.iSubItem = i;
|
|
lv.iItem = iSel;
|
|
cwz += SendMessageW(GetDlgItem(hwnd,IDC_USER_LIST), LVM_GETITEMTEXTW, iSel, (LPARAM)&lv);
|
|
cwz++;
|
|
crtf += WideCharToMultiByte(CP_ACP, 0, wzBuffer, -1, NULL, 0, NULL, NULL) - 1;
|
|
crtf += sizeof(rtfRowPref)-1;
|
|
crtf += sizeof(rtfRowSuff)-1;
|
|
};
|
|
cwz++;
|
|
crtf += sizeof(rtfRowFooter)-1;
|
|
};
|
|
|
|
crtf += sizeof(rtfEpilogue);
|
|
cwz++;
|
|
|
|
HGLOBAL hgwz = GlobalAlloc(GMEM_FIXED, cwz*sizeof(WCHAR));
|
|
HGLOBAL hgrtf = GlobalAlloc(GMEM_FIXED, crtf);
|
|
|
|
WCHAR *wz = (WCHAR *)GlobalLock(hgwz);
|
|
char *rtf = (char *)GlobalLock(hgrtf);
|
|
|
|
rtfWalk = rtf;
|
|
WCHAR *wzWalk = wz;
|
|
memcpy(rtfWalk, rtfPrologue, sizeof(rtfPrologue));
|
|
rtfWalk += sizeof(rtfPrologue)-1;
|
|
|
|
iSel = -1;
|
|
while ((iSel = SendMessageW(GetDlgItem(hwnd,IDC_USER_LIST), LVM_GETNEXTITEM, iSel, MAKELPARAM(LVNI_SELECTED, 0))) != -1)
|
|
{
|
|
memcpy(rtfWalk, rtfRowHeader, crtfHeader);
|
|
rtfWalk += crtfHeader;
|
|
for(int i=0;i<USER_COL_COUNT;i++)
|
|
{
|
|
memcpy(rtfWalk, rtfRowPref, sizeof(rtfRowPref));
|
|
rtfWalk += sizeof(rtfRowPref)-1;
|
|
|
|
LVITEMW lv;
|
|
|
|
lv.pszText = wzWalk;
|
|
lv.cchTextMax = cwz;
|
|
lv.iSubItem = i;
|
|
lv.iItem = iSel;
|
|
SendMessageW(GetDlgItem(hwnd, IDC_USER_LIST), LVM_GETITEMTEXTW, iSel, (LPARAM)&lv);
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, wzWalk, -1, rtfWalk, crtf, NULL, NULL);
|
|
wzWalk += wcslen(wzWalk);
|
|
if (i == 11)
|
|
{
|
|
*wzWalk++ = L'\r';
|
|
*wzWalk++ = L'\n';
|
|
}
|
|
else
|
|
*wzWalk++ = L'\t';
|
|
|
|
rtfWalk += strlen(rtfWalk);
|
|
memcpy(rtfWalk, rtfRowSuff, sizeof(rtfRowSuff));
|
|
rtfWalk += sizeof(rtfRowSuff)-1;
|
|
};
|
|
memcpy(rtfWalk, rtfRowFooter, sizeof(rtfRowFooter));
|
|
rtfWalk += sizeof(rtfRowFooter)-1;
|
|
};
|
|
|
|
memcpy(rtfWalk, rtfEpilogue, sizeof(rtfEpilogue));
|
|
rtfWalk += sizeof(rtfEpilogue);
|
|
*wzWalk++ = 0;
|
|
|
|
// Assert(rtfWalk - rtf == crtf);
|
|
// Assert(wzWalk - wz == cwz);
|
|
|
|
GlobalUnlock(hgwz);
|
|
GlobalUnlock(hgrtf);
|
|
|
|
SetClipboardData(CF_UNICODETEXT, hgwz);
|
|
SetClipboardData(RegisterClipboardFormatA(szRTFClipFormat), hgrtf);
|
|
|
|
// hgwz and hgrtf are now owned by the system. DO NOT FREE!
|
|
CloseClipboard();
|
|
|
|
|
|
|
|
|
|
}
|
|
void UMExportDataToCSV (TCHAR *FileName)
|
|
{
|
|
// Open file
|
|
|
|
// write headers
|
|
|
|
|
|
// loop through data structure and write all fields.
|
|
|
|
// Should we include filtered data views?
|
|
|
|
}
|
|
|
|
*/
|
|
LRESULT CALLBACK
|
|
UserDlgProc(
|
|
HWND hwnd,
|
|
UINT iMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
|
|
// int Index = 0;
|
|
TCHAR Temp[100];
|
|
LVITEM lvi;
|
|
static int cDragOffset;
|
|
switch (iMsg)
|
|
{
|
|
case WM_NOTIFY:
|
|
{
|
|
|
|
switch(((NMHDR *)lParam)->code)
|
|
{
|
|
|
|
case LVN_COLUMNCLICK:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
_itot(((NM_LISTVIEW*)lParam)->iSubItem,Temp,10);
|
|
|
|
ListView_SortItemsEx( ((NMHDR *)lParam)->hwndFrom,
|
|
UmCompareFunc,
|
|
((NM_LISTVIEW*)lParam)->iSubItem
|
|
);
|
|
|
|
g_bUMSortAsc = !g_bUMSortAsc;
|
|
break;
|
|
case NM_CLICK:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
|
|
g_iSelCurrent = ((NM_LISTVIEW*)lParam)->iItem;
|
|
lvi.iItem = g_iSelCurrent;
|
|
lvi.mask = LVIF_PARAM;
|
|
ListView_GetItem(((NMHDR *)lParam)->hwndFrom, &lvi);
|
|
g_iSelCurrent = lvi.lParam;
|
|
|
|
DisplayUserBucketData(hwnd, g_iSelCurrent);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
case WM_INITDIALOG:
|
|
OnUserDialogInit(hwnd);
|
|
return TRUE;
|
|
|
|
case WM_FileTreeLoaded:
|
|
|
|
RefreshUserMode(hwnd);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
//if (g_iSelCurrent > -1)
|
|
//WriteNotesFile(hwnd);
|
|
OnUserContextMenu(hwnd, lParam );
|
|
return TRUE;
|
|
case WM_ERASEBKGND:
|
|
// Don't know why this doesn't happen automatically...
|
|
{
|
|
HDC hdc = (HDC)wParam;
|
|
HPEN hpen = (HPEN)CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE));
|
|
HPEN hpenOld = (HPEN)SelectObject(hdc, hpen);
|
|
SelectObject(hdc, GetSysColorBrush(COLOR_BTNFACE));
|
|
RECT rc;
|
|
GetClientRect(hwnd, &rc);
|
|
Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
|
|
SelectObject(hdc, hpenOld);
|
|
DeleteObject(hpen);
|
|
return TRUE;
|
|
}
|
|
/*case WM_LBUTTONUP:
|
|
if (bCapture)
|
|
{
|
|
HWND hSlider = GetDlgItem(hwnd, IDC_VERT_SLIDER);
|
|
RECT rcDlg;
|
|
GetClientRect(hwnd, &rcDlg);
|
|
//MoveWindow(hSlider,
|
|
SetWindowPos( hSlider,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + (rcCombo.bottom - rcCombo.top) ,
|
|
rcDlg.right - rcDlg.left - yOffset,
|
|
6,
|
|
SWP_NOZORDER);
|
|
|
|
|
|
|
|
ReleaseCapture();
|
|
bCapture = FALSE;
|
|
}
|
|
*/
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
|
|
|
|
/* case IDC_VERT_SLIDER:
|
|
{
|
|
RECT r;
|
|
GetWindowRect(GetDlgItem(hwnd, IDC_USER_EDIT), &r);
|
|
//cDragOffset = GET_X_LPARAM(GetMessagePos()) - r.right;
|
|
//fCapture = DRAG_HORIZ;
|
|
|
|
cDragOffset = GET_Y_LPARAM(GetMessagePos()) - r.bottom;
|
|
|
|
bCapture = TRUE;
|
|
SetCapture(hwnd);
|
|
return 0;
|
|
};
|
|
*/
|
|
case ID_REPORT_ALLUSERMODEFAULTS:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
ReportUserModeFault(hwnd, FALSE,0);
|
|
RefreshUserMode(hwnd);
|
|
break;
|
|
case ID_REPORT_SELECTEDBUCKET:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
ReportUserModeFault(hwnd, TRUE, GetDlgItem(hwnd, IDC_USER_LIST));
|
|
RefreshUserMode(hwnd);
|
|
break;
|
|
case ID_VIEW_CRASHLOG:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
ViewCrashLog();
|
|
}
|
|
else
|
|
{
|
|
ErrorLoadTree();
|
|
}
|
|
break;
|
|
case ID_VIEW_REFRESH140:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
RefreshUserMode(hwnd);
|
|
}
|
|
else
|
|
{
|
|
ErrorLoadTree();
|
|
}
|
|
|
|
break;
|
|
case ID_VIEW_MICROSOFTRESPONSE:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
ViewResponse(hwnd, TRUE);
|
|
}
|
|
else
|
|
{
|
|
ErrorLoadTree();
|
|
}
|
|
break;
|
|
// case ID_EDIT_COPY144:
|
|
// UMCopyToClipboard(hwnd);
|
|
// break;
|
|
case ID_VIEW_BUCKETOVERRIDERESPONSE155:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
ViewResponse(hwnd, FALSE);
|
|
}
|
|
else
|
|
{
|
|
ErrorLoadTree();
|
|
}
|
|
break;
|
|
case ID_VIEW_BUCKETCABFILEDIRECTORY157:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
ViewBucketDir(hwnd);
|
|
break;
|
|
case ID_REPORT_ALL:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
//SendMessage(GetParent(hwnd), WM_COMMAND, 0, 0);
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_REPORT_ALLCRASHES,0),0);
|
|
break;
|
|
case ID_EDIT_USERMODEREPORTINGOPTIONS:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_EDIT_DEFAULTPOLICY,0),0);
|
|
RefreshUserMode(hwnd);
|
|
break;
|
|
case ID_EDIT_SELECTEDBUCKETREPORTINGOPTIONS:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_EDIT_SELECTEDBUCKETSPOLICY,0),0);
|
|
break;
|
|
|
|
}
|
|
|
|
switch (HIWORD(wParam))
|
|
{
|
|
case CBN_SELCHANGE:
|
|
if (g_iSelCurrent > -1)
|
|
{
|
|
WriteNotesFile(hwnd);
|
|
g_iSelCurrent = -1;
|
|
}
|
|
RefreshUserMode(hwnd);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|