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.
2602 lines
62 KiB
2602 lines
62 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
KernelMode.cpp
|
|
|
|
Abstract:
|
|
|
|
This module contains all code necessary to upload and process a
|
|
Kernel mode fault through the OCA Web Site
|
|
executive.
|
|
|
|
Author:
|
|
|
|
Steven Beerbroer (sbeer) 20-Jun-2002
|
|
|
|
Environment:
|
|
|
|
User mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "main.h"
|
|
#include "Kernelmode.h"
|
|
#include "WinMessages.h"
|
|
#include "Clist.h"
|
|
#include "usermode.h"
|
|
#ifdef DEBUG
|
|
#define KRNL_MODE_SERVER _T("Redbgitwb10")
|
|
#else
|
|
#define KRNL_MODE_SERVER _T("oca.microsoft.com")
|
|
#endif
|
|
|
|
|
|
extern TCHAR CerRoot[];
|
|
extern KMODE_DATA KModeData;
|
|
extern HINSTANCE g_hinst;
|
|
extern HWND hKrnlMode;
|
|
HWND g_hListView = NULL;
|
|
BOOL g_bSortAsc = TRUE;
|
|
HANDLE g_hStopEvent = NULL;
|
|
//Globals
|
|
HANDLE ThreadParam;
|
|
|
|
|
|
DWORD BucketWindowSize = 120;
|
|
DWORD TextOffset = 10;
|
|
int g_CurrentIndex = -1;
|
|
extern Clist CsvContents;
|
|
extern TCHAR szKerenelColumnHeaders[][100];
|
|
extern BOOL g_bAdminAccess;
|
|
// ListView CallBacks for sorting.
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
FMicrosoftComURL
|
|
|
|
Returns TRUE if we think the sz is a URL to a microsoft.com web site
|
|
----------------------------------------------------------------- MRuhlen --*/
|
|
BOOL IsMicrosoftComURL(TCHAR *sz)
|
|
{
|
|
TCHAR *pch;
|
|
|
|
if (sz == NULL || _tcslen(sz) < 20) // "http://microsoft.com
|
|
return FALSE;
|
|
|
|
if (_tcsncicmp(sz, szHttpPrefix, _tcslen(szHttpPrefix)))
|
|
return FALSE;
|
|
|
|
pch = sz + _tcslen(szHttpPrefix);
|
|
|
|
while (*pch != _T('/') && *pch != _T('\0'))
|
|
pch++;
|
|
|
|
if (*pch == _T('\0'))
|
|
return FALSE;
|
|
|
|
// found the end of the server name
|
|
if (_tcsncicmp(pch - strlen(_T(".microsoft.com")), _T(".microsoft.com"),_tcslen(_T(".microsoft.com"))
|
|
) &&
|
|
_tcsncicmp(pch - strlen(_T("/microsoft.com")), _T("/microsoft.com"),_tcslen(_T("/microsoft.com"))
|
|
) &&
|
|
_tcsncicmp(pch - _tcslen(_T(".msn.com")), _T(".msn.com") ,_tcslen(_T(".msn.com"))
|
|
)
|
|
#ifdef DEBUG
|
|
&& _tcsncicmp(pch - _tcslen(_T("ocatest.msbpn.com")), _T("ocatest.msbpn.com") ,_tcslen(_T("ocatest.msbpn.com")))
|
|
&& _tcsncicmp(pch - _tcslen(_T("redbgitwb10")), _T("redbgitwb10") ,_tcslen(_T("redbgitwb10")))
|
|
|
|
#endif
|
|
)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int CALLBACK CompareFunc (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
int Result = -1;
|
|
int SubItemIndex = (INT) lParamSort;
|
|
int Item1, Item2;
|
|
TCHAR String1[1000];
|
|
TCHAR String2 [1000];
|
|
|
|
ZeroMemory(String1, sizeof String1);
|
|
ZeroMemory(String2, sizeof String2);
|
|
ListView_GetItemText( g_hListView, lParam1, SubItemIndex, String1, 1000);
|
|
ListView_GetItemText( g_hListView, lParam2, SubItemIndex, String2, 1000);
|
|
if (! (String1 && String2) )
|
|
return 1;
|
|
|
|
|
|
if (lParam1 == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
if (g_bSortAsc) // Sort Acending
|
|
{
|
|
if ((lParamSort == 0) || (lParamSort == 1))
|
|
{
|
|
// 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 == 1))
|
|
{
|
|
// Conver to int and compare
|
|
Item1 = atoi(String1);
|
|
Item2 = atoi(String2);
|
|
if (Item1 > Item2)
|
|
Result = -1;
|
|
else
|
|
Result = 1;
|
|
}
|
|
else
|
|
{
|
|
Result = -_tcsicmp(String1,String2);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
if (Result == 0)
|
|
Result = -1;
|
|
return Result;
|
|
}
|
|
|
|
int
|
|
GetResponseUrl(
|
|
IN TCHAR *szWebSiteName,
|
|
IN TCHAR *szDumpFileName,
|
|
OUT TCHAR *szResponseUrl
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine calles the Oca_Extension.dll and returns the URL received to the caller
|
|
|
|
Arguments:
|
|
|
|
szWebSiteName - Name of OCA Web Site to process the dump file
|
|
|
|
szDumpFileName - Name of file returned from the UploadDumpFile() function
|
|
|
|
szResponseUrl - TCHAR string to hold the URL returned from the OCA Isapi Dll
|
|
|
|
Return value:
|
|
|
|
0 on Success.
|
|
Win32 Error Code on failure.
|
|
++*/
|
|
|
|
{
|
|
TCHAR IsapiUrl[255];
|
|
HINTERNET hSession = NULL;
|
|
TCHAR LocalUrl[255];
|
|
HINTERNET hUrlFile = NULL;
|
|
TCHAR buffer[255] ;
|
|
DWORD dwBytesRead = 0;
|
|
BOOL bRead = TRUE;
|
|
BOOL Status = FALSE;
|
|
DWORD ResponseCode = 0;
|
|
DWORD ResLength = 255;
|
|
DWORD index = 0;
|
|
ZeroMemory (buffer, sizeof buffer);
|
|
ZeroMemory (IsapiUrl, sizeof IsapiUrl);
|
|
ZeroMemory (LocalUrl, sizeof LocalUrl);
|
|
if (StringCbPrintf (IsapiUrl,sizeof IsapiUrl, _T("http://%s/isapi/oca_extension.dll?id=%s&Type=2"),szWebSiteName, szDumpFileName)!= S_OK)
|
|
{
|
|
// Busted
|
|
goto ERRORS;
|
|
}
|
|
hSession = InternetOpen(_T("CER15"),
|
|
INTERNET_OPEN_TYPE_PRECONFIG,
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
if (hSession)
|
|
{
|
|
// Open the url we want to connect to.
|
|
hUrlFile = InternetOpenUrl(hSession,
|
|
IsapiUrl,
|
|
NULL,
|
|
0,
|
|
0,
|
|
0);
|
|
if (hUrlFile)
|
|
{
|
|
if (HttpQueryInfo( hUrlFile,
|
|
HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER,
|
|
&ResponseCode,
|
|
&ResLength,
|
|
&index) )
|
|
{
|
|
if ( (ResponseCode < 200 ) || (ResponseCode > 299))
|
|
{
|
|
Status = -1;
|
|
goto ERRORS;
|
|
}
|
|
// Read the page returned by the isapi dll.
|
|
if (hUrlFile)
|
|
{
|
|
bRead = InternetReadFile(hUrlFile,
|
|
buffer,
|
|
sizeof(buffer),
|
|
&dwBytesRead);
|
|
|
|
if (StringCbCopy (szResponseUrl, sizeof buffer, buffer) != S_OK)
|
|
{
|
|
Status = -1;
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
if (!IsMicrosoftComURL(szResponseUrl))
|
|
{
|
|
// Zero out the response
|
|
ZeroMemory(szResponseUrl,MAX_PATH);
|
|
}
|
|
// Check the return value of the url if it is a time out stop
|
|
// uploading and return FALSE.
|
|
TCHAR *pCode = _tcsstr( szResponseUrl,_T("Code="));
|
|
if (pCode)
|
|
{
|
|
Status = -2;
|
|
}
|
|
else
|
|
{
|
|
Status = 0;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//MessageBox(NULL,_T("Failed to open response URL"), NULL,MB_OK);
|
|
Status = -1;
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Status = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Status = -1;
|
|
}
|
|
|
|
ERRORS:
|
|
if (Status == -1)
|
|
MessageBox(hKrnlMode, _T("Failed to connect to the Internet.\r\nPlease verify your Internet connection."),NULL, MB_OK);
|
|
|
|
if (hUrlFile)
|
|
InternetCloseHandle(hUrlFile);
|
|
if (hSession)
|
|
InternetCloseHandle(hSession);
|
|
return Status;
|
|
}
|
|
|
|
|
|
DWORD
|
|
UploadDumpFile(
|
|
IN TCHAR *szWebSiteName,
|
|
IN TCHAR *szDumpFileName,
|
|
IN TCHAR *szVirtualDir,
|
|
OUT TCHAR *szUploadedDumpFileName
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine calles the Oca_Extension.dll and returns the URL received to the caller
|
|
|
|
Arguments:
|
|
|
|
szWebSiteName - Name of OCA Web Site to process the dump file
|
|
|
|
szDumpFileName - Name of file to Uploaded
|
|
szVirtualDir - Virtual directory to put file to.
|
|
|
|
szResponseUrl - TCHAR string to hold the name the file was uploaded as
|
|
|
|
Return value:
|
|
|
|
0 on Success.
|
|
Win32 Error Code on failure.
|
|
++*/
|
|
{
|
|
static const TCHAR *pszAccept[] = {_T("*.*"), 0};
|
|
// TCHAR RemoteFileName[MAX_PATH]; // Host/Virtualdirectory/filename
|
|
BOOL bRet = FALSE;
|
|
BOOL UploadSuccess = FALSE;
|
|
DWORD dwBytesRead = 0;
|
|
DWORD dwBytesWritten = 0;
|
|
DWORD ResponseCode = 0;
|
|
DWORD ResLength = 255;
|
|
DWORD index = 0;
|
|
DWORD ErrorCode = 0;
|
|
HINTERNET hSession = NULL;
|
|
HINTERNET hConnect = NULL;
|
|
HINTERNET hRequest = NULL;
|
|
INTERNET_BUFFERS BufferIn = {0};
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
BYTE *pBuffer = NULL;
|
|
GUID guidNewGuid;
|
|
char *szGuidRaw = NULL;
|
|
HRESULT hResult = S_OK;
|
|
wchar_t *wszGuidRaw = NULL;
|
|
TCHAR DestinationName[MAX_PATH];
|
|
|
|
|
|
CoInitialize(NULL);
|
|
hResult = CoCreateGuid(&guidNewGuid);
|
|
if (FAILED(hResult))
|
|
{
|
|
//-------------What do we send here....
|
|
goto cleanup;
|
|
;
|
|
}
|
|
else
|
|
{
|
|
if (UuidToStringW(&guidNewGuid, &wszGuidRaw) == RPC_S_OK)
|
|
{
|
|
if ( (szGuidRaw = (char *) malloc ( wcslen(wszGuidRaw)*2 )) != NULL)
|
|
{
|
|
// clear the memory
|
|
ZeroMemory(szGuidRaw, wcslen(wszGuidRaw) * 2);
|
|
wcstombs( szGuidRaw, wszGuidRaw, wcslen(wszGuidRaw));
|
|
}
|
|
else
|
|
{
|
|
ErrorCode = GetLastError();
|
|
goto cleanup;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (StringCbPrintf(DestinationName, MAX_PATH * sizeof TCHAR, _T("\\%s\\%s_%s"),szVirtualDir,szGuidRaw + 19, PathFindFileName(szDumpFileName)) != S_OK)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
//StringCbPrintf(szUploadedDumpFileName, MAX_PATH * sizeof TCHAR, _T("%s.cab"),szGuidRaw + 19);
|
|
if (StringCbPrintf(szUploadedDumpFileName, MAX_PATH * sizeof TCHAR, _T("%s_%s"),szGuidRaw + 19, PathFindFileName(szDumpFileName)) != S_OK)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
hSession = InternetOpen( _T("CER15"),
|
|
INTERNET_OPEN_TYPE_PRECONFIG,
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
if (!hSession)
|
|
{
|
|
ErrorCode = 1;
|
|
//MessageBox(NULL, _T("Internet Open Failed"), NULL, MB_OK);
|
|
goto cleanup;
|
|
}
|
|
|
|
hConnect = InternetConnect(hSession,
|
|
szWebSiteName,
|
|
INTERNET_DEFAULT_HTTPS_PORT,
|
|
NULL,
|
|
NULL,
|
|
INTERNET_SERVICE_HTTP,
|
|
0,
|
|
NULL);
|
|
|
|
if (!hConnect)
|
|
{
|
|
//MessageBox(NULL, _T("Internet Connect Failed"), NULL, MB_OK);
|
|
ErrorCode = 1;
|
|
goto cleanup;
|
|
}
|
|
hRequest = HttpOpenRequest( hConnect,
|
|
_T("PUT"),
|
|
DestinationName,
|
|
NULL,
|
|
NULL,
|
|
pszAccept,
|
|
INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_SECURE,
|
|
0);
|
|
if (hRequest)
|
|
{
|
|
hFile = CreateFile( szDumpFileName,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
|
|
|
|
// Clear the buffer
|
|
if ( (pBuffer = (BYTE *)malloc (70000)) != NULL)
|
|
{
|
|
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );
|
|
BufferIn.Next = NULL;
|
|
BufferIn.lpcszHeader = NULL;
|
|
BufferIn.dwHeadersLength = 0;
|
|
BufferIn.dwHeadersTotal = 0;
|
|
BufferIn.lpvBuffer = NULL;
|
|
BufferIn.dwBufferLength = 0;
|
|
BufferIn.dwOffsetLow = 0;
|
|
BufferIn.dwOffsetHigh = 0;
|
|
BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
|
|
FillMemory(pBuffer, 70000,'\0'); // Fill buffer with data
|
|
|
|
// DWORD dwBuffLen = sizeof DWORD;
|
|
|
|
if(!HttpSendRequestEx( hRequest,
|
|
&BufferIn,
|
|
NULL,
|
|
HSR_INITIATE,
|
|
0))
|
|
{
|
|
;
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
dwBytesRead = 0;
|
|
bRet = ReadFile(hFile,
|
|
pBuffer,
|
|
70000,
|
|
&dwBytesRead,
|
|
NULL);
|
|
if (bRet != 0)
|
|
{
|
|
bRet = InternetWriteFile(hRequest,
|
|
pBuffer,
|
|
dwBytesRead,
|
|
&dwBytesWritten);
|
|
|
|
if ( (!bRet) || (dwBytesWritten==0) )
|
|
{
|
|
;
|
|
}
|
|
|
|
|
|
}
|
|
} while (dwBytesRead == 70000);
|
|
|
|
CloseHandle(hFile);
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
bRet = HttpEndRequest( hRequest,
|
|
NULL,
|
|
0,
|
|
0);
|
|
if (bRet)
|
|
{
|
|
ResponseCode = 0;
|
|
HttpQueryInfo(hRequest,
|
|
HTTP_QUERY_STATUS_CODE |HTTP_QUERY_FLAG_NUMBER,
|
|
&ResponseCode,
|
|
&ResLength,
|
|
&index);
|
|
|
|
if ( (ResponseCode != 200) && (ResponseCode != 201))
|
|
{
|
|
ErrorCode=1;
|
|
}
|
|
else
|
|
{
|
|
ErrorCode = 0;
|
|
UploadSuccess = TRUE;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//MessageBox(NULL, _T("End Request Failed"), NULL, MB_OK);
|
|
ErrorCode = 1;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
//MessageBox(NULL, _T("Malloc Failed"), NULL, MB_OK);
|
|
ErrorCode = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//MessageBox(NULL, _T("File Open Failed"), NULL, MB_OK);
|
|
ErrorCode = 3;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//MessageBox(NULL, _T("Internet Open Request Failed"), NULL, MB_OK);
|
|
ErrorCode = 1;
|
|
}
|
|
|
|
cleanup:
|
|
// Clean up
|
|
if (hFile!= INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle (hFile);
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
if (hSession)
|
|
{
|
|
InternetCloseHandle(hSession);
|
|
hSession = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
if (hConnect)
|
|
{
|
|
InternetCloseHandle(hConnect);
|
|
hConnect = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
|
|
if (hRequest)
|
|
{
|
|
InternetCloseHandle(hRequest);
|
|
hRequest = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
if (pBuffer)
|
|
{
|
|
free (pBuffer);
|
|
pBuffer = NULL;
|
|
}
|
|
|
|
if (wszGuidRaw)
|
|
{
|
|
RpcStringFreeW(&wszGuidRaw);
|
|
wszGuidRaw = NULL;
|
|
}
|
|
if (szGuidRaw)
|
|
{
|
|
free(szGuidRaw);
|
|
szGuidRaw = NULL;
|
|
}
|
|
CoUninitialize();
|
|
return ErrorCode;
|
|
|
|
}
|
|
|
|
void UpdateKrnlList(HWND hwnd,
|
|
int BucketId,
|
|
TCHAR *BucketString,
|
|
TCHAR *Response1,
|
|
TCHAR *Response2,
|
|
DWORD Count)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Adds a row to the Kernel Mode list view control
|
|
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Dialog box to be updated
|
|
BucketID - The Integer ID of the Current Bucket
|
|
Response - The Microsoft response for the current bucket
|
|
Count - The number of hits for the current bucket
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
LVITEM lvi;
|
|
// TCHAR Temp[100];
|
|
// double ElapsedTime;
|
|
ZeroMemory(&lvi, sizeof LVITEM);
|
|
// TCHAR tmpbuf[128];
|
|
// COLORREF CurrentColor;
|
|
// HWND hEditBox;
|
|
TCHAR TempString [50];
|
|
TCHAR *pTchar = NULL;
|
|
lvi.mask = LVIF_TEXT | LVIF_STATE;
|
|
lvi.state = 0;
|
|
lvi.stateMask = 0;
|
|
|
|
++g_CurrentIndex;
|
|
lvi.iItem = g_CurrentIndex ;
|
|
// lvI.iImage = index;
|
|
lvi.iSubItem = 0;
|
|
|
|
if (BucketId == -2)
|
|
{
|
|
if (StringCbCopy(TempString, sizeof TempString, _T("Kernel Faults not reported to Microsoft")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
BucketId = 0;
|
|
}
|
|
|
|
else
|
|
{
|
|
if (BucketId == -1)
|
|
{
|
|
if (StringCbCopy(TempString, sizeof TempString, _T("Invalid Dump File")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//BucketId = 0;
|
|
if (BucketId > 0)
|
|
{
|
|
if (StringCbPrintf(TempString, sizeof TempString, _T("%d"), BucketId) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Invalid bucket id
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
lvi.pszText = TempString;
|
|
ListView_InsertItem(hwnd,&lvi);
|
|
|
|
lvi.iSubItem = 1;
|
|
if (StringCbPrintf(TempString, sizeof TempString, _T("%d"), Count) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
lvi.pszText = TempString;
|
|
|
|
ListView_SetItem(hwnd,&lvi);
|
|
|
|
lvi.iSubItem = 2;
|
|
|
|
// if response1 = -1 use response2
|
|
pTchar = _tcsstr(Response1, _T("sid="));
|
|
if (pTchar)
|
|
{
|
|
pTchar += 4;
|
|
if (_ttoi(pTchar) == -1)
|
|
{
|
|
lvi.pszText = Response2;
|
|
}
|
|
else
|
|
{
|
|
// use response1
|
|
lvi.pszText = Response1;
|
|
}
|
|
ListView_SetItem(hwnd,&lvi);
|
|
}
|
|
|
|
|
|
|
|
|
|
ERRORS:
|
|
return;
|
|
|
|
}
|
|
|
|
void RefreshKrnlView(HWND hwnd)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Reloads the kernel mode Cer tree data and refreshes the GUI View.
|
|
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Dialog box to be updated
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
TCHAR BucketId[100];
|
|
TCHAR BucketString[MAX_PATH];
|
|
TCHAR Response1[MAX_PATH];
|
|
TCHAR Response2[MAX_PATH];
|
|
TCHAR Count[100];
|
|
// TCHAR szPolicyText[512];
|
|
BOOL bEOF;
|
|
ListView_DeleteAllItems(g_hListView);
|
|
|
|
|
|
g_CurrentIndex = -1;
|
|
|
|
TCHAR szPath[MAX_PATH];
|
|
HANDLE hFind = INVALID_HANDLE_VALUE;
|
|
// HANDLE hCsv = INVALID_HANDLE_VALUE;
|
|
WIN32_FIND_DATA FindData;
|
|
CsvContents.CleanupList();
|
|
CsvContents.ResetCurrPos();
|
|
CsvContents.bInitialized = FALSE;
|
|
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
ZeroMemory (szPath, sizeof szPath);
|
|
// From the filetree root goto cabs/bluescreen
|
|
|
|
if (StringCbCopy(szPath, sizeof szPath, CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szPath, sizeof szPath, _T("\\cabs\\blue\\*.cab")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
if (!PathIsDirectory(CerRoot))
|
|
{
|
|
MessageBox(NULL,_T("Failed to connect to the CER Tree."), NULL, MB_OK);
|
|
}
|
|
hFind = FindFirstFile(szPath, &FindData);
|
|
KModeData.UnprocessedCount = 0;
|
|
// Check to see if the blue.csv exists.
|
|
if ( hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
++ KModeData.UnprocessedCount;
|
|
} while (FindNextFile(hFind, &FindData));
|
|
FindClose(hFind);
|
|
}
|
|
UpdateKrnlList(g_hListView,
|
|
-2,
|
|
_T("Kernel Faults not reported to Microsoft"),
|
|
_T(""),
|
|
_T(""),
|
|
KModeData.UnprocessedCount);
|
|
// Search for all unprocessed (not .old) cabs and get a count
|
|
if (StringCbCopy(szPath, sizeof szPath, CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szPath, sizeof szPath, _T("\\Status\\Blue\\Kernel.csv")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
CsvContents.Initialize(szPath);
|
|
CsvContents.ResetCurrPos();
|
|
|
|
while (CsvContents.GetNextEntry(BucketId,
|
|
BucketString,
|
|
Response1,
|
|
Response2,
|
|
Count,
|
|
&bEOF))
|
|
{
|
|
UpdateKrnlList( g_hListView,
|
|
_ttoi(BucketId),
|
|
BucketString,
|
|
Response1,
|
|
Response2,
|
|
_ttoi(Count));
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set the kernel mode status file path
|
|
// First make sure the direcory exists.
|
|
|
|
if (StringCbPrintf(CsvContents.KernelStatusDir, sizeof CsvContents.KernelStatusDir, _T("%s\\Status\\blue"), CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (!PathIsDirectory(CsvContents.KernelStatusDir))
|
|
{
|
|
CreateDirectory(CsvContents.KernelStatusDir, NULL);
|
|
}
|
|
|
|
if (StringCbCat(CsvContents.KernelStatusDir, sizeof CsvContents.KernelStatusDir, _T("\\status.txt")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
|
|
if (PathFileExists(CsvContents.KernelStatusDir))
|
|
{
|
|
ParseKrnlStatusFile();
|
|
}
|
|
}
|
|
SendMessage(GetDlgItem(hwnd,IDC_KRNL_EDIT ), WM_SETTEXT, NULL, (LPARAM)_T(""));
|
|
//PopulateKrnlBucketData(hwnd);
|
|
//SetDlgItemText(hwnd, IDC_KRNL_EDIT, szPolicyText);
|
|
ERRORS:
|
|
return;
|
|
}
|
|
|
|
|
|
void
|
|
OnKrnlDialogInit(
|
|
IN HWND hwnd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is called when the Kernel mode dialog is initialized.
|
|
1) Posisions all of the dialog box controls
|
|
2) Calls RefreshKrnlView()
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Kernel mode dialog box
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
DWORD yOffset = 5;
|
|
RECT rc;
|
|
RECT rcButton;
|
|
RECT rcDlg;
|
|
RECT rcList;
|
|
RECT rcStatic;
|
|
//RECT rcCombo;
|
|
|
|
HWND hParent = GetParent(hwnd);
|
|
HWND hButton = GetDlgItem(hParent, IDC_USERMODE);
|
|
|
|
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
|
|
HWND hList = GetDlgItem(hwnd, IDC_KRNL_LIST);
|
|
SetWindowPos(hList,NULL, rcDlg.left + yOffset, rcDlg.top , rcDlg.right - rcDlg.left - yOffset, rcDlg.bottom - BucketWindowSize - rcDlg.top , SWP_NOZORDER);
|
|
GetWindowRect(hList, &rcList);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.left);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.right);
|
|
|
|
// Position the bucket info window.
|
|
HWND hBucket2 = GetDlgItem(hwnd, IDC_BUCKETTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + TextOffset ,
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
SetDlgItemText(hwnd, IDC_BUCKETTEXT,"Bucket Information:");
|
|
//SetDlgItemText(hwnd, IDC_FLTR_RESPONSE, "All Responses");
|
|
|
|
GetClientRect (hBucket2, &rcStatic);
|
|
|
|
HWND hBucket = GetDlgItem (hwnd, IDC_KRNL_EDIT);
|
|
SetWindowPos(hBucket,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + TextOffset + (rcStatic.bottom - rcStatic.top) +5,
|
|
rcDlg.right - rcDlg.left - yOffset,
|
|
rcDlg.bottom - (rcList.bottom + TextOffset + (rcStatic.bottom - rcStatic.top) ),
|
|
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;
|
|
|
|
// Add the columns.
|
|
for (iCol = 0; iCol < KRNL_COL_COUNT; iCol++)
|
|
{
|
|
lvc.iSubItem = iCol;
|
|
lvc.pszText = szKerenelColumnHeaders[iCol];
|
|
lvc.cx = 100; // width of column in pixels
|
|
lvc.fmt = LVCFMT_LEFT; // left-aligned column
|
|
if (ListView_InsertColumn(hList, iCol, &lvc) == -1)
|
|
{
|
|
;
|
|
}
|
|
|
|
}
|
|
ListView_SetColumnWidth(hList, KRNL_COL_COUNT-1, LVSCW_AUTOSIZE_USEHEADER);
|
|
|
|
|
|
|
|
|
|
g_hListView = hList;
|
|
|
|
RefreshKrnlView(hwnd);
|
|
}
|
|
|
|
void ResizeKrlMode(HWND hwnd)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine handles the vertical and horizontal dialog resizing.
|
|
Arguments:
|
|
|
|
hwnd - Handle of the Kernel mode dialog box
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
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;
|
|
|
|
|
|
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
|
|
HWND hList = GetDlgItem(hwnd, IDC_KRNL_LIST);
|
|
SetWindowPos(hList,NULL, rcDlg.left + yOffset, rcDlg.top , rcDlg.right - rcDlg.left - yOffset, rcDlg.bottom - BucketWindowSize - rcDlg.top , SWP_NOZORDER);
|
|
GetWindowRect(hList, &rcList);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.left);
|
|
ScreenToClient(hList, (LPPOINT)&rcList.right);
|
|
|
|
// Position the bucket info window.
|
|
HWND hBucket2 = GetDlgItem(hwnd, IDC_BUCKETTEXT);
|
|
SetWindowPos(hBucket2,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + TextOffset ,
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOZORDER);
|
|
SetDlgItemText(hwnd, IDC_BUCKETTEXT,"Bucket Information:");
|
|
//SetDlgItemText(hwnd, IDC_FLTR_RESPONSE, "All Responses");
|
|
|
|
GetClientRect (hBucket2, &rcStatic);
|
|
|
|
HWND hBucket = GetDlgItem (hwnd, IDC_KRNL_EDIT);
|
|
SetWindowPos(hBucket,
|
|
NULL,
|
|
rcDlg.left + yOffset,
|
|
rcList.bottom + TextOffset + (rcStatic.bottom - rcStatic.top) +5,
|
|
rcDlg.right - rcDlg.left - yOffset,
|
|
rcDlg.bottom - (rcList.bottom + TextOffset + (rcStatic.bottom - rcStatic.top) ),
|
|
SWP_NOZORDER);
|
|
|
|
|
|
ListView_SetColumnWidth(hList, KRNL_COL_COUNT-1, LVSCW_AUTOSIZE_USEHEADER);
|
|
}
|
|
BOOL WriteKernelStatusFile()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine renames a proccessed cab file from .cab to .old
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
BOOL bStatus = FALSE;
|
|
// move the existing status file to .old
|
|
|
|
TCHAR szFileNameOld[MAX_PATH];
|
|
TCHAR *Temp;
|
|
TCHAR Buffer[1024];
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
DWORD dwWritten = 0;
|
|
if (StringCbCopy(szFileNameOld,sizeof szFileNameOld, CsvContents.KernelStatusDir) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Temp = szFileNameOld;
|
|
Temp += _tcslen(szFileNameOld) * sizeof TCHAR;
|
|
while ( (*Temp != _T('.')) && (Temp != szFileNameOld))
|
|
{
|
|
Temp --;
|
|
}
|
|
|
|
if (Temp == szFileNameOld)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy (Temp,sizeof szFileNameOld , _T(".old")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
if (PathFileExists(CsvContents.KernelStatusDir))
|
|
{
|
|
MoveFileEx(CsvContents.KernelStatusDir, szFileNameOld, TRUE);
|
|
}
|
|
|
|
|
|
// create a new status file.
|
|
|
|
hFile = CreateFile(CsvContents.KernelStatusDir,
|
|
GENERIC_WRITE,
|
|
NULL,
|
|
NULL,
|
|
CREATE_ALWAYS,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.Tracking, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("Tracking=%s\r\n"), CsvContents.KrnlPolicy.Tracking) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.CrashPerBucketCount, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("Crashes per bucket=%s\r\n"), CsvContents.KrnlPolicy.CrashPerBucketCount) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.UrlToLaunch, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("URLLaunch=%s\r\n"), CsvContents.KrnlPolicy.UrlToLaunch) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.SecondLevelData, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("NoSecondLevelCollection=%s\r\n"), CsvContents.KrnlPolicy.SecondLevelData) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.FileCollection, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("NoFileCollection=%s\r\n"), CsvContents.KrnlPolicy.FileCollection) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.Response, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("Response=%s\r\n"), CsvContents.KrnlPolicy.Response) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.BucketID, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("Bucket=%s\r\n"), CsvContents.KrnlPolicy.BucketID) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.RegKey, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("RegKey=%s\r\n"), CsvContents.KrnlPolicy.RegKey) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
}
|
|
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.iData, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("iData=%s\r\n"),CsvContents.KrnlPolicy.iData) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.WQL, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("WQL=%s\r\n"), CsvContents.KrnlPolicy.WQL) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.GetFile, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("GetFile=%s\r\n"), CsvContents.KrnlPolicy.GetFile) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
// Write the StatusContents data to the new status file
|
|
if (_tcscmp (CsvContents.KrnlPolicy.GetFileVersion, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("GetFileVersion=%s\r\n"), CsvContents.KrnlPolicy.GetFileVersion) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
if (_tcscmp (CsvContents.KrnlPolicy.AllowResponse, _T("\0")))
|
|
{
|
|
if (StringCbPrintf(Buffer, sizeof Buffer, _T("NoExternalURL=%s\r\n"), CsvContents.KrnlPolicy.AllowResponse) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
WriteFile(hFile , Buffer, _tcslen(Buffer) *sizeof TCHAR , &dwWritten, NULL);
|
|
|
|
}
|
|
|
|
|
|
// Close the new status file
|
|
CloseHandle(hFile);
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
// if all ok delete the old status file.
|
|
//DeleteFile(szFileNameOld);
|
|
}
|
|
|
|
ERRORS:
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(hFile);
|
|
}
|
|
return bStatus;
|
|
}
|
|
|
|
BOOL ParseKrnlStatusFile()
|
|
{
|
|
FILE *pFile = NULL;
|
|
TCHAR Buffer[100];
|
|
// TCHAR szTempDir[MAX_PATH];
|
|
TCHAR *Temp = NULL;
|
|
// int id = 0;
|
|
ZeroMemory(Buffer,sizeof Buffer);
|
|
|
|
|
|
pFile = _tfopen(CsvContents.KernelStatusDir, _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(CsvContents.KrnlPolicy.BucketID, sizeof CsvContents.KrnlPolicy.BucketID, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer,RESPONSE_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(RESPONSE_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.Response, sizeof CsvContents.KrnlPolicy.Response, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, URLLAUNCH_PREFIX);
|
|
if (Temp == Buffer)
|
|
{
|
|
Temp+= _tcslen(URLLAUNCH_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.UrlToLaunch , sizeof CsvContents.KrnlPolicy.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(CsvContents.KrnlPolicy.SecondLevelData , sizeof CsvContents.KrnlPolicy.SecondLevelData , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, TRACKING_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(TRACKING_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.Tracking , sizeof CsvContents.KrnlPolicy.Tracking , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, CRASH_PERBUCKET_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(CRASH_PERBUCKET_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.CrashPerBucketCount , sizeof CsvContents.KrnlPolicy.CrashPerBucketCount , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, FILE_COLLECTION_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FILE_COLLECTION_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.FileCollection , sizeof CsvContents.KrnlPolicy.FileCollection, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, REGKEY_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(REGKEY_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.RegKey , sizeof CsvContents.KrnlPolicy.RegKey , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, FDOC_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(FDOC_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.fDoc , sizeof CsvContents.KrnlPolicy.fDoc , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, IDATA_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(IDATA_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.iData , sizeof CsvContents.KrnlPolicy.iData , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, WQL_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(WQL_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.WQL , sizeof CsvContents.KrnlPolicy.WQL , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, GETFILE_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(GETFILE_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.GetFile , sizeof CsvContents.KrnlPolicy.GetFile, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, GETFILEVER_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(GETFILEVER_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.GetFileVersion , sizeof CsvContents.KrnlPolicy.GetFileVersion , Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
Temp = _tcsstr(Buffer, MEMDUMP_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(MEMDUMP_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.MemoryDump , sizeof CsvContents.KrnlPolicy.MemoryDump, Temp) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
Temp = _tcsstr(Buffer, ALLOW_EXTERNAL_PREFIX);
|
|
if (Temp==Buffer)
|
|
{
|
|
Temp+= _tcslen(ALLOW_EXTERNAL_PREFIX);
|
|
if (StringCbCopy(CsvContents.KrnlPolicy.AllowResponse , sizeof CsvContents.KrnlPolicy.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;
|
|
}
|
|
|
|
|
|
|
|
void OnKrnlContextMenu(HWND hwnd,
|
|
LPARAM lParam)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Loads and provides a message pump for the Kernel 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_KRNLCONTEXT));
|
|
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_SUBMIT_FAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLKERNELMODEFAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETCABFILEDIRECTORY125, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_SPECIFIC_BUCKET, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETOVERRIDERESPONSE166, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_CRASH, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH121, MF_BYCOMMAND| MF_GRAYED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_COPY147, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_POPUP_VIEW_KERNELBUCKETPOLICY, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_DEFAULTREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EXPORT_KERNELMODEFAULTDATA172, MF_BYCOMMAND| MF_GRAYED);
|
|
if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
// Enable the menu items
|
|
EnableMenuItem (hMenu, ID_SUBMIT_FAULTS, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLKERNELMODEFAULTS, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETCABFILEDIRECTORY125, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_SPECIFIC_BUCKET, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_BUCKETOVERRIDERESPONSE166, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_CRASH, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_VIEW_REFRESH121, MF_BYCOMMAND| MF_ENABLED);
|
|
//EnableMenuItem (hMenu, ID_EDIT_COPY147, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_POPUP_VIEW_KERNELBUCKETPOLICY, MF_BYCOMMAND| MF_ENABLED);
|
|
EnableMenuItem (hMenu, ID_EDIT_DEFAULTREPORTINGOPTIONS, MF_BYCOMMAND| MF_ENABLED);
|
|
// EnableMenuItem (hMenu, ID_EXPORT_KERNELMODEFAULTDATA172, MF_BYCOMMAND| MF_ENABLED);
|
|
if (!g_bAdminAccess)
|
|
{
|
|
EnableMenuItem (hMenu, ID_SUBMIT_FAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_REPORT_ALLKERNELMODEFAULTS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_EDIT_DEFAULTREPORTINGOPTIONS, MF_BYCOMMAND| MF_GRAYED);
|
|
EnableMenuItem (hMenu, ID_POPUP_VIEW_KERNELBUCKETPOLICY, 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 DoLaunchBrowser(HWND hwnd, BOOL URL_OVERRIDE)
|
|
|
|
/*++
|
|
|
|
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_KRNL_LIST);
|
|
// TCHAR CommandLine[512];
|
|
// STARTUPINFO StartupInfo;
|
|
// PROCESS_INFORMATION ProcessInfo;
|
|
int sel;
|
|
ZeroMemory (Url, sizeof Url);
|
|
|
|
if (!URL_OVERRIDE)
|
|
{
|
|
sel = ListView_GetNextItem(hList,-1, LVNI_SELECTED);
|
|
ListView_GetItemText(hList, sel,2, Url,sizeof Url);
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy(Url, sizeof Url, CsvContents.KrnlPolicy.UrlToLaunch) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
if ( (!_tcsncicmp(Url, _T("http://"), _tcslen(_T("http://")))) || (!_tcsncicmp(Url, _T("https://"), _tcslen(_T("https://")))))
|
|
{
|
|
|
|
if (_tcscmp(Url, _T("\0")))
|
|
{
|
|
SHELLEXECUTEINFOA sei = {0};
|
|
sei.cbSize = sizeof(sei);
|
|
sei.lpFile = Url;
|
|
sei.nShow = SW_SHOWDEFAULT;
|
|
if (! ShellExecuteEx(&sei) )
|
|
{
|
|
// What do we display here.
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
ERRORS:
|
|
;
|
|
|
|
}
|
|
|
|
void UpdateCsv(TCHAR *ResponseUrl)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine updates Kernel.csv with the current Microsoft response data and bucket counts.
|
|
Called by KrnlUploadThreadProc()
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
TCHAR BucketId[100];
|
|
TCHAR BucketString[MAX_PATH];
|
|
TCHAR szResponse1[MAX_PATH];
|
|
TCHAR szResponse2[MAX_PATH];
|
|
TCHAR *SourceChar;
|
|
TCHAR *DestChar;
|
|
TCHAR GBsid[100];
|
|
int CharCount = 0;
|
|
// Parse the returned url and update the Csv file data structurs.
|
|
|
|
// Make sure the response URL has data.
|
|
if (!_tcscmp(ResponseUrl, _T("\0")))
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
// TO DO--- Add a check for an SID of -1 and zero out the string if found.
|
|
SourceChar = ResponseUrl;
|
|
DestChar = szResponse1;
|
|
CharCount = sizeof szResponse1/ sizeof TCHAR - sizeof TCHAR;
|
|
while ((CharCount > 0) && (*SourceChar != _T('&')) &&( *SourceChar != _T('\0')) )
|
|
{
|
|
--CharCount;
|
|
*DestChar = *SourceChar;
|
|
++DestChar;
|
|
++SourceChar;
|
|
}
|
|
*DestChar = _T('\0');
|
|
++SourceChar; // Skip the &
|
|
|
|
// Get the SBucket String
|
|
SourceChar = _tcsstr(ResponseUrl, _T("szSBucket="));
|
|
|
|
if (SourceChar)
|
|
{
|
|
CharCount = sizeof BucketString/ sizeof TCHAR - sizeof TCHAR;
|
|
SourceChar += 10;
|
|
DestChar = BucketString;
|
|
while ((CharCount > 0) && (*SourceChar != _T('&')))
|
|
{
|
|
--CharCount;
|
|
*DestChar = *SourceChar;
|
|
++DestChar;
|
|
++SourceChar;
|
|
}
|
|
*DestChar = _T('\0');
|
|
}
|
|
|
|
// Get the sbucket int
|
|
SourceChar = _tcsstr(ResponseUrl, _T("iSBucket="));
|
|
if (SourceChar)
|
|
{
|
|
SourceChar += 9;
|
|
DestChar = BucketId;
|
|
CharCount = sizeof BucketId/ sizeof TCHAR - sizeof TCHAR;
|
|
while ((CharCount > 0) && (*SourceChar != _T('&')) )
|
|
{
|
|
--CharCount;
|
|
*DestChar = *SourceChar;
|
|
++DestChar;
|
|
++SourceChar;
|
|
}
|
|
*DestChar = _T('\0');
|
|
}
|
|
// Get the gBucket sid
|
|
SourceChar = _tcsstr(ResponseUrl, _T("gsid="));
|
|
if (SourceChar)
|
|
{
|
|
SourceChar += 5;
|
|
DestChar = GBsid;
|
|
CharCount = sizeof GBsid/ sizeof TCHAR - sizeof TCHAR;
|
|
while((CharCount > 0) && (*SourceChar != _T('&')) && (*SourceChar != _T('\0')) )
|
|
{
|
|
--CharCount;
|
|
*DestChar = *SourceChar;
|
|
++DestChar;
|
|
++SourceChar;
|
|
}
|
|
*DestChar = _T('\0');
|
|
}
|
|
|
|
// Build the gBucket Response String
|
|
|
|
if (StringCbCopy(szResponse2,sizeof szResponse2, szResponse1) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
SourceChar = szResponse2;
|
|
SourceChar += _tcslen(szResponse2) * sizeof TCHAR;
|
|
|
|
if (SourceChar != szResponse2)
|
|
{
|
|
while((*(SourceChar -1) != _T('=')) && ( (SourceChar -1) != szResponse2))
|
|
{
|
|
-- SourceChar;
|
|
}
|
|
if (StringCbCopy (SourceChar, sizeof szResponse2 - (_tcslen(SourceChar) *sizeof TCHAR), GBsid) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
CsvContents.UpdateList(BucketId,BucketString, szResponse1, szResponse2);
|
|
ERRORS:
|
|
return;
|
|
}
|
|
|
|
void RenameToOld(TCHAR *szFileName)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine renames a proccessed cab file from .cab to .old
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
TCHAR szFileNameOld[MAX_PATH];
|
|
TCHAR *Temp;
|
|
|
|
if (StringCbCopy(szFileNameOld,sizeof szFileNameOld, szFileName) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Temp = szFileNameOld;
|
|
Temp += _tcslen(szFileNameOld) * sizeof TCHAR;
|
|
while ( (*Temp != _T('.')) && (Temp != szFileNameOld))
|
|
{
|
|
Temp --;
|
|
}
|
|
|
|
if (Temp == szFileNameOld)
|
|
{
|
|
// Abort since we did not find the .cab extension.
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
if (StringCbCopy (Temp, (_tcslen(szFileNameOld) * sizeof TCHAR) - ( _tcslen(szFileNameOld) * sizeof TCHAR - 5 * sizeof TCHAR), _T(".old")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
MoveFileEx(szFileName, szFileNameOld, TRUE);
|
|
}
|
|
ERRORS:
|
|
return;
|
|
}
|
|
|
|
DWORD WINAPI KrnlUploadThreadProc (void *ThreadParam)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine renames a proccessed cab file from .cab to .old
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
|
|
{
|
|
HANDLE hFind = INVALID_HANDLE_VALUE;
|
|
WIN32_FIND_DATA FindData;
|
|
TCHAR szFileName[MAX_PATH];
|
|
// HANDLE hCsv;
|
|
TCHAR szSearchPath[MAX_PATH];
|
|
TCHAR ResponseURL[MAX_PATH];
|
|
TCHAR DestinationName[MAX_PATH];
|
|
TCHAR StaticText[MAX_PATH];
|
|
// int CurrentPos = 0;
|
|
TCHAR CsvName[MAX_PATH];
|
|
int ErrorCode = 0;
|
|
HANDLE hEvent = NULL;
|
|
|
|
ZeroMemory( szFileName, sizeof szFileName);
|
|
ZeroMemory( ResponseURL, sizeof ResponseURL);
|
|
ZeroMemory( szSearchPath, sizeof szSearchPath);
|
|
ZeroMemory( DestinationName, sizeof DestinationName);
|
|
ZeroMemory( StaticText, sizeof StaticText);
|
|
ZeroMemory( CsvName, sizeof CsvName);
|
|
|
|
hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("StopKernelUpload"));
|
|
if (!hEvent)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
else
|
|
{
|
|
if (WaitForSingleObject(hEvent, 50) == WAIT_OBJECT_0)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
if (StringCbPrintf(CsvName, sizeof CsvName, _T("%s\\cabs\\blue\\Kernel.csv"), CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbPrintf(szSearchPath,sizeof szSearchPath, _T("%s\\cabs\\blue\\*.cab"), CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
// Get the next file to upload
|
|
hFind = FindFirstFile(szSearchPath, &FindData);
|
|
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do {
|
|
// Did the upload get canceled
|
|
if (WaitForSingleObject(hEvent, 50) == WAIT_OBJECT_0)
|
|
{
|
|
goto Canceled;
|
|
}
|
|
if (StringCbPrintf(szFileName, sizeof szFileName, _T("%s\\cabs\\blue\\%s"), CerRoot, FindData.cFileName) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
// Upload the file
|
|
if (StringCbPrintf(StaticText, sizeof StaticText, _T("Uploading File: %s"), szFileName) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
SetDlgItemText(* ((HWND *) ThreadParam), IDC_CAB_TEXT, StaticText);
|
|
ErrorCode = UploadDumpFile(KRNL_MODE_SERVER, szFileName,_T("OCA"), DestinationName);
|
|
if (ErrorCode == 1)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (ErrorCode != 0) // all other errors are related to a particular file not the internet connection
|
|
{ // Move on to the next file.
|
|
goto SKIPIT;
|
|
}
|
|
SendDlgItemMessage(*((HWND *) ThreadParam) ,IDC_FILE_PROGRESS, PBM_STEPIT, 0,0);
|
|
|
|
// Get the response for the file.
|
|
if (StringCbPrintf(StaticText, sizeof StaticText, _T("Retrieving response for: %s"), szFileName) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemText(* ((HWND *) ThreadParam), IDC_CAB_TEXT, StaticText);
|
|
ErrorCode = GetResponseUrl(KRNL_MODE_SERVER, DestinationName, ResponseURL);
|
|
if (ErrorCode == -1)
|
|
{
|
|
// Internet connection error.
|
|
// We need to stop processing.
|
|
goto ERRORS;
|
|
//RenameToOld(szFileName); // we don't want to halt processing for these errors.
|
|
//ErrorCode = 2;
|
|
//goto ERRORS;
|
|
|
|
}
|
|
|
|
else
|
|
{
|
|
if (ErrorCode == -2)
|
|
{
|
|
// all other errors we just rename the file and keep going.
|
|
RenameToOld(szFileName);
|
|
goto SKIPIT;
|
|
}
|
|
else
|
|
{
|
|
RenameToOld(szFileName);
|
|
|
|
|
|
// MessageBox(NULL, ResponseURL, "Received Response", MB_OK);
|
|
|
|
SendDlgItemMessage(*((HWND *) ThreadParam) ,IDC_FILE_PROGRESS, PBM_STEPIT, 0,0);
|
|
|
|
// Update the CSV File
|
|
//
|
|
if (StringCbPrintf(StaticText, sizeof StaticText, _T("Updating local data:")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
SetDlgItemText(* ((HWND *) ThreadParam), IDC_CAB_TEXT, StaticText);
|
|
SendDlgItemMessage(*((HWND *) ThreadParam) ,IDC_FILE_PROGRESS, PBM_STEPIT, 0,0);
|
|
|
|
|
|
// Update Status
|
|
UpdateCsv(ResponseURL);
|
|
//CsvContents.WriteCsv();
|
|
SendDlgItemMessage(*((HWND *) ThreadParam) ,IDC_TOTAL_PROGRESS, PBM_STEPIT, 0,0);
|
|
SendDlgItemMessage(*((HWND *) ThreadParam) ,IDC_FILE_PROGRESS, PBM_SETPOS, 0,0);
|
|
}
|
|
}
|
|
}
|
|
SKIPIT:
|
|
;
|
|
} while (FindNextFile(hFind, &FindData));
|
|
FindClose( hFind);
|
|
hFind = INVALID_HANDLE_VALUE;
|
|
Canceled:
|
|
CsvContents.WriteCsv();
|
|
}
|
|
|
|
|
|
ERRORS:
|
|
if (ErrorCode == 1)
|
|
{
|
|
MessageBox(* ((HWND *) ThreadParam), _T("Upload to Microsoft failed.\r\nPlease check your Internet Connection"), NULL,MB_OK);
|
|
}
|
|
if (ErrorCode == 2)
|
|
{
|
|
//MessageBox(* ((HWND *) ThreadParam), _T("Failed to retrieve a response from Microsoft."), NULL,MB_OK);
|
|
}
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
FindClose(hFind);
|
|
}
|
|
PostMessage(*((HWND *) ThreadParam), WmSyncDone, FALSE, 0);
|
|
if (hEvent)
|
|
{
|
|
CloseHandle(hEvent);
|
|
hEvent = NULL;
|
|
}
|
|
//RefreshKrnlView(*((HWND *) ThreadParam));
|
|
return 0;
|
|
|
|
}
|
|
|
|
LRESULT CALLBACK
|
|
KrnlSubmitDlgProc(
|
|
HWND hwnd,
|
|
UINT iMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine renames a proccessed cab file from .cab to .old
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
// int CurrentPos = 0;
|
|
|
|
// HWND Parent = GetParent(hwnd);
|
|
switch (iMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Start the upload process in a new thread.
|
|
// Report results using WM_FILEDONE
|
|
|
|
// CreateEvent();
|
|
|
|
SendDlgItemMessage(hwnd,IDC_TOTAL_PROGRESS, PBM_SETRANGE,0, MAKELPARAM(0, KModeData.UnprocessedCount));
|
|
SendDlgItemMessage(hwnd ,IDC_TOTAL_PROGRESS, PBM_SETSTEP, MAKELONG( 1,0),0);
|
|
|
|
SendDlgItemMessage(hwnd,IDC_FILE_PROGRESS, PBM_SETRANGE,0, MAKELPARAM(0, 3));
|
|
SendDlgItemMessage(hwnd ,IDC_FILE_PROGRESS, PBM_SETSTEP, MAKELONG( 1,0),0);
|
|
g_hStopEvent = CreateEvent(NULL, FALSE, FALSE, _T("StopKernelUpload"));
|
|
if (!g_hStopEvent)
|
|
{
|
|
PostMessage(hwnd, WmSyncDone, FALSE,0);
|
|
}
|
|
PostMessage(hwnd, WmSyncStart, FALSE, 0);
|
|
break;
|
|
|
|
case WmSyncStart:
|
|
HANDLE hThread;
|
|
|
|
ThreadParam = hwnd;
|
|
hThread = CreateThread(NULL, 0,KrnlUploadThreadProc , &ThreadParam, 0 , NULL );
|
|
CloseHandle(hThread);
|
|
// OnSubmitDlgInit(hwnd);
|
|
|
|
break;
|
|
|
|
case WmSetStatus:
|
|
|
|
break;
|
|
|
|
case WmSyncDone:
|
|
if (g_hStopEvent)
|
|
{
|
|
CloseHandle(g_hStopEvent);
|
|
g_hStopEvent = NULL;
|
|
}
|
|
|
|
EndDialog(hwnd, 1);
|
|
return TRUE;
|
|
|
|
case WM_DESTROY:
|
|
if (g_hStopEvent)
|
|
{
|
|
SetEvent(g_hStopEvent);
|
|
if (g_hStopEvent)
|
|
CloseHandle(g_hStopEvent);
|
|
}
|
|
else
|
|
{
|
|
EndDialog(hwnd, 1);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDCANCEL:
|
|
if (g_hStopEvent)
|
|
{
|
|
SetEvent(g_hStopEvent);
|
|
CloseHandle(g_hStopEvent);
|
|
g_hStopEvent = NULL;
|
|
}
|
|
else
|
|
{
|
|
EndDialog(hwnd, 1);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void DoViewBucketDirectory()
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
if (StringCbPrintf(szPath, sizeof szPath, _T("%s\\cabs\\blue"), CerRoot) != 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.
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VOID DoSubmitKernelFaults(HWND hwnd)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine renames a proccessed cab file from .cab to .old
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
Does not return a value
|
|
++*/
|
|
{
|
|
//HANDLE hFind = INVALID_HANDLE_VALUE;
|
|
//WIN32_FIND_DATA FindData;
|
|
//TCHAR szPath[MAX_PATH];
|
|
// handled by the Progress bar dialog box.
|
|
|
|
// First check to see if there are any cabs to submit
|
|
/* if (_tcscmp(CerRoot, _T("\0")))
|
|
{
|
|
ZeroMemory (szPath, sizeof szPath);
|
|
// From the filetree root goto cabs/bluescreen
|
|
|
|
if (StringCbCopy(szPath, sizeof szPath, CerRoot) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
if (StringCbCat(szPath, sizeof szPath, _T("\\cabs\\blue\\*.cab")) != S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
hFind = FindFirstFile(szPath, &FindData);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
// we have at least 1 to upload
|
|
FindClose(hFind);
|
|
*/
|
|
DialogBox (g_hinst,MAKEINTRESOURCE(IDD_KERNEL_SYNC) , hwnd, (DLGPROC)KrnlSubmitDlgProc);
|
|
if (g_hStopEvent)
|
|
{
|
|
CloseHandle(g_hStopEvent);
|
|
g_hStopEvent = NULL;
|
|
}
|
|
// }
|
|
///}
|
|
RefreshKrnlView(hwnd);
|
|
//ERRORS:
|
|
return;
|
|
}
|
|
|
|
|
|
BOOL DisplayKrnlBucketData(HWND hwnd, int iItem)
|
|
{
|
|
HWND hEditBox = GetDlgItem(hwnd, IDC_KRNL_EDIT);
|
|
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.
|
|
TCHAR *Dest = NULL;
|
|
TCHAR *Source = NULL;
|
|
TCHAR TempBuffer[1000];
|
|
|
|
ZeroMemory (TempBuffer,sizeof TempBuffer);
|
|
Buffer = (TCHAR *) malloc (BufferLength);
|
|
if (Buffer)
|
|
{
|
|
ZeroMemory(Buffer,BufferLength);
|
|
|
|
// Basic data collection first.
|
|
if ( (!_tcscmp (CsvContents.KrnlPolicy.SecondLevelData, _T("YES"))) && (_tcscmp(CsvContents.KrnlPolicy.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(CsvContents.KrnlPolicy.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 ( !_tcscmp (CsvContents.KrnlPolicy.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 (StringCbPrintf(Buffer, BufferLength, _T("The following information will be sent to Microsoft:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_tcscmp(CsvContents.KrnlPolicy.GetFile, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("These files:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Source = CsvContents.KrnlPolicy.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(CsvContents.KrnlPolicy.RegKey, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("These Registry Keys:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
|
|
Source = CsvContents.KrnlPolicy.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(CsvContents.KrnlPolicy.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 = CsvContents.KrnlPolicy.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 (CsvContents.KrnlPolicy.MemoryDump, _T("YES")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The contents of memory\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
if (_tcscmp(CsvContents.KrnlPolicy.GetFileVersion, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The versions of these files:\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
Source = CsvContents.KrnlPolicy.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(CsvContents.KrnlPolicy.fDoc, _T("\0")))
|
|
{
|
|
if (StringCbCat(Buffer, BufferLength, _T("The users current document.\r\n"))!= S_OK)
|
|
{
|
|
goto ERRORS;
|
|
}
|
|
}
|
|
SendMessage(hEditBox, WM_SETTEXT, NULL, (LPARAM)Buffer);
|
|
|
|
|
|
}
|
|
|
|
|
|
ERRORS:
|
|
if (Buffer)
|
|
free(Buffer);
|
|
return TRUE;
|
|
}
|
|
/*
|
|
void KMCopyToClipboard(HWND hwnd)
|
|
{
|
|
if (!OpenClipboard(NULL))
|
|
return;
|
|
|
|
EmptyClipboard();
|
|
char rtfRowHeader[sizeof(rtfRowHeader1) + (sizeof(rtfRowHeader2)+6)*KRNL_COL_COUNT + sizeof(rtfRowHeader3)];
|
|
char *rtfWalk = rtfRowHeader;
|
|
memcpy(rtfWalk, rtfRowHeader1, sizeof(rtfRowHeader1));
|
|
rtfWalk += sizeof(rtfRowHeader1)-1;
|
|
DWORD cxTotal = 0;
|
|
for(int i=0;i<KRNL_COL_COUNT;i++)
|
|
{
|
|
LVCOLUMNA lv;
|
|
lv.mask = LVCF_WIDTH;
|
|
lv.iSubItem = i;
|
|
SendMessageA(GetDlgItem(hwnd,IDC_KRNL_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_KRNL_LIST), LVM_GETNEXTITEM, iSel, MAKELPARAM(LVNI_SELECTED, 0))) != -1)
|
|
{
|
|
crtf += crtfHeader;
|
|
for(int i=0;i<KRNL_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_KRNL_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_KRNL_LIST), LVM_GETNEXTITEM, iSel, MAKELPARAM(LVNI_SELECTED, 0))) != -1)
|
|
{
|
|
memcpy(rtfWalk, rtfRowHeader, crtfHeader);
|
|
rtfWalk += crtfHeader;
|
|
for(int i=0;i<KRNL_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_KRNL_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();
|
|
}
|
|
*/
|
|
LRESULT CALLBACK
|
|
KrnlDlgProc(
|
|
HWND hwnd,
|
|
UINT iMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Is the notification handler for the Kernel Mode dialog box
|
|
Arguments:
|
|
|
|
ResponseUrl - Microsoft response for the recently submitted dump file.
|
|
|
|
Return value:
|
|
|
|
returns an LRESULT
|
|
TRUE = The message was handled.
|
|
FALSE = The message was ignored.
|
|
++*/
|
|
{
|
|
TCHAR Temp[100];
|
|
switch (iMsg)
|
|
{
|
|
case WM_NOTIFY:
|
|
{
|
|
|
|
switch(((NMHDR *)lParam)->code)
|
|
{
|
|
|
|
case LVN_COLUMNCLICK:
|
|
|
|
_itot(((NM_LISTVIEW*)lParam)->iSubItem,Temp,10);
|
|
|
|
ListView_SortItemsEx( ((NMHDR *)lParam)->hwndFrom,
|
|
CompareFunc,
|
|
((NM_LISTVIEW*)lParam)->iSubItem
|
|
);
|
|
|
|
g_bSortAsc = !g_bSortAsc;
|
|
break;
|
|
case NM_CLICK:
|
|
DisplayKrnlBucketData(hwnd, ((NM_LISTVIEW*)lParam)->iItem);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_INITDIALOG:
|
|
OnKrnlDialogInit(hwnd);
|
|
return TRUE;
|
|
|
|
case WM_FileTreeLoaded:
|
|
RefreshKrnlView(hwnd);
|
|
return TRUE;
|
|
case WM_CONTEXTMENU:
|
|
OnKrnlContextMenu(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_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case ID_SPECIFIC_BUCKET:
|
|
DoLaunchBrowser(hwnd, FALSE);
|
|
break;
|
|
case ID_VIEW_BUCKETOVERRIDERESPONSE166:
|
|
DoLaunchBrowser(hwnd, TRUE);
|
|
break;
|
|
case ID_REPORT_ALLKERNELMODEFAULTS:
|
|
DoSubmitKernelFaults(hwnd);
|
|
//RefreshKrnlView(hwnd);
|
|
break;
|
|
case ID_VIEW_BUCKETCABFILEDIRECTORY125:
|
|
case ID_VIEW_BUCKETCABFILEDIRECTORY:
|
|
DoViewBucketDirectory();
|
|
break;
|
|
case ID_VIEW_REFRESH121:
|
|
case ID_VIEW_REFRESH:
|
|
RefreshKrnlView(hwnd);
|
|
break;
|
|
case ID_VIEW_CRASH:
|
|
ViewCrashLog();
|
|
break;
|
|
case ID_SUBMIT_FAULTS:
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_REPORT_ALLCRASHES,0),0);
|
|
break;
|
|
case ID_EDIT_DEFAULTREPORTINGOPTIONS:
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_EDIT_DEFAULTPOLICY,0),0);
|
|
break;
|
|
/// case ID_EDIT_COPY147:
|
|
// KMCopyToClipboard(hwnd);
|
|
// break;
|
|
case ID_POPUP_VIEW_KERNELBUCKETPOLICY:
|
|
PostMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(ID_EDIT_SELECTEDBUCKETSPOLICY,0),0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
return FALSE;
|
|
|
|
}
|