Skip to content

Commit 58750f5

Browse files
author
Jan Wilmans
committed
added Verbose Kernel Message toggle and Pass-through mode toggle
1 parent 31b6d48 commit 58750f5

File tree

8 files changed

+124
-22
lines changed

8 files changed

+124
-22
lines changed

application/DebugViewpp/DebugView++.rc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ BEGIN
112112
MENUITEM "&Pause\tPause", ID_LOG_PAUSE
113113
MENUITEM "Capture &Global Win32", ID_LOG_GLOBAL
114114
MENUITEM "Capture &Kernel Messages", ID_LOG_KERNEL
115+
MENUITEM "&Verbose Kernel Messages", ID_LOG_KERNEL_VERBOSE
116+
MENUITEM "Pass-&Through mode", ID_LOG_KERNEL_PASSTHROUGH
115117
MENUITEM "Connect DebugView &Agent", ID_LOG_DEBUGVIEW_AGENT
116118
MENUITEM "Sources...", ID_LOG_SOURCES
117119
MENUITEM "History Size...", ID_LOG_HISTORY
@@ -622,7 +624,9 @@ STRINGTABLE
622624
BEGIN
623625
ID_LOG_PAUSE "Pause log recording\nPause"
624626
ID_LOG_GLOBAL "Capture logs from all processes\nCapture Global Win32"
625-
ID_LOG_KERNEL "Capture logs from kerenel processes\nCapture Kernel Messages"
627+
ID_LOG_KERNEL "Capture logs from kernel processes\nCapture Kernel Messages"
628+
ID_LOG_KERNEL_VERBOSE "Enable verbose kernel messsages\nVerbose Kernel Messages"
629+
ID_LOG_KERNEL_PASSTHROUGH "Enable Pass-throught mode\nPass-Through mode"
626630
ID_LOG_DEBUGVIEW_AGENT "Connect DbgView Agent\nConnect DbgView Agent"
627631
ID_LOG_HISTORY "Configure log file history size\nConfigure History Size"
628632
ID_VIEW_CLEAR "Clear log view\nClear View"

application/DebugViewpp/MainFrame.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ BEGIN_MSG_MAP2(CMainFrame)
130130
COMMAND_ID_HANDLER_EX(ID_LOG_PAUSE, OnLogPause)
131131
COMMAND_ID_HANDLER_EX(ID_LOG_GLOBAL, OnLogGlobal)
132132
COMMAND_ID_HANDLER_EX(ID_LOG_KERNEL, OnLogKernel)
133+
COMMAND_ID_HANDLER_EX(ID_LOG_KERNEL_VERBOSE, OnLogKernelVerbose)
134+
COMMAND_ID_HANDLER_EX(ID_LOG_KERNEL_PASSTHROUGH, OnLogKernelPassThrough)
133135
COMMAND_ID_HANDLER_EX(ID_LOG_HISTORY, OnLogHistory)
134136
COMMAND_ID_HANDLER_EX(ID_LOG_DEBUGVIEW_AGENT, OnLogDebugviewAgent)
135137
COMMAND_ID_HANDLER_EX(ID_VIEW_FIND, OnViewFind)
@@ -330,6 +332,10 @@ void CMainFrame::UpdateUI()
330332
UIEnable(ID_LOG_GLOBAL, !!m_pLocalReader);
331333
UISetCheck(ID_LOG_GLOBAL, m_tryGlobal);
332334
UISetCheck(ID_LOG_KERNEL, m_tryKernel);
335+
UIEnable(ID_LOG_KERNEL_VERBOSE, !!m_pKernelReader);
336+
UIEnable(ID_LOG_KERNEL_PASSTHROUGH, !!m_pKernelReader);
337+
UISetCheck(ID_LOG_KERNEL_VERBOSE, m_verboseKernelMessage);
338+
UISetCheck(ID_LOG_KERNEL_PASSTHROUGH, m_passthroughMode);
333339
}
334340

335341
std::wstring FormatDateTime(const SYSTEMTIME& systemTime)
@@ -1529,6 +1535,24 @@ void CMainFrame::OnLogKernel(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl
15291535
UpdateTitle();
15301536
}
15311537

1538+
void CMainFrame::OnLogKernelVerbose(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl*/)
1539+
{
1540+
m_verboseKernelMessage = !m_verboseKernelMessage;
1541+
if (m_pKernelReader)
1542+
{
1543+
m_pKernelReader->SetVerbose(m_verboseKernelMessage);
1544+
}
1545+
}
1546+
1547+
void CMainFrame::OnLogKernelPassThrough(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl*/)
1548+
{
1549+
m_passthroughMode = !m_passthroughMode;
1550+
if (m_pKernelReader)
1551+
{
1552+
m_pKernelReader->SetPassThrough(m_passthroughMode);
1553+
}
1554+
}
1555+
15321556
void CMainFrame::OnLogHistory(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl*/)
15331557
{
15341558
CHistoryDlg dlg(m_logFile.GetHistorySize(), m_logFile.GetHistorySize() == 0);

application/DebugViewpp/MainFrame.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class CMainFrame : public CTabbedFrameImpl<CMainFrame, CDotNetTabCtrl<SelectedTa
6262
UPDATE_ELEMENT(ID_LOG_PAUSE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
6363
UPDATE_ELEMENT(ID_LOG_GLOBAL, UPDUI_MENUPOPUP)
6464
UPDATE_ELEMENT(ID_LOG_KERNEL, UPDUI_MENUPOPUP)
65+
UPDATE_ELEMENT(ID_LOG_KERNEL_VERBOSE, UPDUI_MENUPOPUP)
66+
UPDATE_ELEMENT(ID_LOG_KERNEL_PASSTHROUGH, UPDUI_MENUPOPUP)
6567
UPDATE_ELEMENT(ID_VIEW_SCROLL, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
6668
UPDATE_ELEMENT(ID_VIEW_SCROLL_STOP, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
6769
UPDATE_ELEMENT(ID_VIEW_TIME, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
@@ -177,6 +179,8 @@ class CMainFrame : public CTabbedFrameImpl<CMainFrame, CDotNetTabCtrl<SelectedTa
177179
void OnLogPause(UINT uNotifyCode, int nID, CWindow wndCtl);
178180
void OnLogGlobal(UINT uNotifyCode, int nID, CWindow wndCtl);
179181
void OnLogKernel(UINT uNotifyCode, int nID, CWindow wndCtl);
182+
void OnLogKernelVerbose(UINT uNotifyCode, int nID, CWindow wndCtl);
183+
void OnLogKernelPassThrough(UINT uNotifyCode, int nID, CWindow wndCtl);
180184
void OnLogHistory(UINT uNotifyCode, int nID, CWindow wndCtl);
181185
void OnLogDebugviewAgent(UINT uNotifyCode, int nID, CWindow wndCtl);
182186
void OnViewFind(UINT uNotifyCode, int nID, CWindow wndCtl);
@@ -208,8 +212,8 @@ class CMainFrame : public CTabbedFrameImpl<CMainFrame, CDotNetTabCtrl<SelectedTa
208212
Win32::HFont m_hFont;
209213
bool m_linkViews = false;
210214
bool m_hide = false;
211-
bool m_tryGlobal;
212-
bool m_tryKernel;
215+
bool m_tryGlobal = false;
216+
bool m_tryKernel = false;
213217
CRunDlg m_runDlg;
214218
std::wstring m_logFileName;
215219
std::wstring m_txtFileName;
@@ -221,6 +225,8 @@ class CMainFrame : public CTabbedFrameImpl<CMainFrame, CDotNetTabCtrl<SelectedTa
221225
DBWinReader* m_pLocalReader = nullptr;
222226
DBWinReader* m_pGlobalReader = nullptr;
223227
KernelReader* m_pKernelReader = nullptr;
228+
bool m_verboseKernelMessage = false;
229+
bool m_passthroughMode = false;
224230
DbgviewReader* m_pDbgviewReader = nullptr;
225231
std::vector<SourceInfo> m_sourceInfos;
226232
std::unique_ptr<GuiExecutorClient> m_GuiExecutorClient;

application/DebugViewpp/resource.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,16 @@
127127
#define ID_VIEW_PROCESS_RENAME 32858
128128
#define ID_OPTIONS_PROCESS_PREFIX 32859
129129
#define ID_LOG_KERNEL 32860
130+
#define ID_LOG_KERNEL_VERBOSE 32861
131+
#define ID_LOG_KERNEL_PASSTHROUGH 32862
130132

131133

132134
// Next default values for new objects
133135
//
134136
#ifdef APSTUDIO_INVOKED
135137
#ifndef APSTUDIO_READONLY_SYMBOLS
136138
#define _APS_NEXT_RESOURCE_VALUE 401
137-
#define _APS_NEXT_COMMAND_VALUE 32857
139+
#define _APS_NEXT_COMMAND_VALUE 32863
138140
#define _APS_NEXT_CONTROL_VALUE 801
139141
#define _APS_NEXT_SYMED_VALUE 107
140142
#endif

application/DebugViewppLib/Debugview_kernel_client.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ const std::string driverPath = "dbgv.sys";
1111

1212
void InstallKernelMessagesDriver()
1313
{
14+
// try to uninstall first, in case the driver is somehow still loaded.
1415
UninstallKernelMessagesDriver();
16+
1517
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
1618
if (!hSCManager) {
1719
std::cout << "Failed to open Service Control Manager. Error: " << GetLastError() << std::endl;
@@ -44,20 +46,23 @@ void InstallKernelMessagesDriver()
4446
void UninstallKernelMessagesDriver()
4547
{
4648
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
47-
if (!hSCManager) {
49+
if (!hSCManager)
50+
{
4851
std::cout << "Failed to open Service Control Manager. Error: " << GetLastError() << std::endl;
52+
return;
4953
}
5054

5155
SC_HANDLE hService = OpenServiceA(hSCManager, DRIVER_SERVICE_NAME, DELETE);
52-
if (!hService) {
56+
if (!hService)
57+
{
5358
std::cout << "Failed to open service. Error: " << GetLastError() << std::endl;
5459
CloseServiceHandle(hSCManager);
60+
return;
5561
}
5662

57-
if (!DeleteService(hService)) {
63+
if (!DeleteService(hService))
64+
{
5865
std::cout << "Failed to delete service. Error: " << GetLastError() << std::endl;
59-
CloseServiceHandle(hService);
60-
CloseServiceHandle(hSCManager);
6166
}
6267
CloseServiceHandle(hService);
6368
CloseServiceHandle(hSCManager);

application/DebugViewppLib/KernelReader.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void KernelReader::StartListening()
3838
}
3939

4040
// enable verbose kernel messages
41-
bRet = DeviceIoControl(handle.get(), DBGV_ENABLE_FILTER_STATE, NULL, 0, NULL, 0, NULL, NULL);
41+
bRet = DeviceIoControl(handle.get(), DBGV_SET_VERBOSE_MESSAGES, NULL, 0, NULL, 0, NULL, NULL);
4242
if (!bRet)
4343
{
4444
printf("DBGV_ENABLE_FILTER_STATE failed, err=%d\n", ::GetLastError());
@@ -102,5 +102,41 @@ void KernelReader::Poll()
102102
}
103103
}
104104

105+
void KernelReader::SetKernelMessagesDriverFeature(DWORD feature)
106+
{
107+
DWORD dwOut = 0;
108+
DWORD dwReturned = 0;
109+
BOOL bRet = DeviceIoControl(m_handle.get(), feature, NULL, 0, &dwOut, sizeof(dwOut), &dwReturned, NULL);
110+
if (!bRet)
111+
{
112+
printf("SetKernelMessagesDriverFeature for '%s' failed, err=%d\n", feature_to_string(feature).c_str(), ::GetLastError());
113+
return;
114+
}
115+
}
116+
117+
void KernelReader::SetVerbose(bool value)
118+
{
119+
if (value)
120+
{
121+
SetKernelMessagesDriverFeature(DBGV_SET_VERBOSE_MESSAGES);
122+
}
123+
else
124+
{
125+
SetKernelMessagesDriverFeature(DBGV_UNSET_VERBOSE_MESSAGES);
126+
}
127+
}
128+
129+
void KernelReader::SetPassThrough(bool value)
130+
{
131+
if (value)
132+
{
133+
SetKernelMessagesDriverFeature(DBGV_SET_PASSTHROUGH);
134+
}
135+
else
136+
{
137+
SetKernelMessagesDriverFeature(DBGV_UNSET_PASSTHROUGH);
138+
}
139+
}
140+
105141
} // namespace debugviewpp
106142
} // namespace fusion

application/include/DebugViewppLib/Debugview_kernel_client.h

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,39 @@ void UninstallKernelMessagesDriver();
1919
// this is the dbgv.sys interface
2020
#define FILE_DEVICE_DBGV 0x8305
2121

22-
#define DBGV_CAPTURE_KERNEL CTL_CODE(FILE_DEVICE_DBGV, DWORD(0), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x00 //enable capture kernel
23-
#define DBGV_UNCAPTURE_KERNEL CTL_CODE(FILE_DEVICE_DBGV, DWORD(1), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x04 //
24-
#define DBGV_CLEAR_DISPLAY CTL_CODE(FILE_DEVICE_DBGV, DWORD(2), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x08 //clear display
25-
#define DBGV_READ_LOG CTL_CODE(FILE_DEVICE_DBGV, DWORD(3), METHOD_NEITHER, FILE_ANY_ACCESS) //0x0f //read kernel log
26-
#define DBGV_SET_PASSTHROUGH CTL_CODE(FILE_DEVICE_DBGV, DWORD(4), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x10 //enable passthrough
27-
#define DBGV_UNSET_PASSTHROUGH CTL_CODE(FILE_DEVICE_DBGV, DWORD(5), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x14 //
28-
#define DBGV_IS_DRIVER_AVAILABLE CTL_CODE(FILE_DEVICE_DBGV, DWORD(8), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x20 //test driver is valid or functional
29-
#define DBGV_GET_DRIVER_VERSION CTL_CODE(FILE_DEVICE_DBGV, DWORD(9), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x24 //driver version, 4.70 = 0x800
30-
#define DBGV_SET_CARRIAGE_RETURN CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0d), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x34 //force carriage return
31-
#define DBGV_UNSET_CARRIAGE_RETURN CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0e), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x38 //
32-
#define DBGV_ENABLE_FILTER_STATE CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0f), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x3C //enable log verbose
33-
#define DBGV_SET_FILTER_STATE CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x10), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x40 //reset log verbose
22+
#define DBGV_CAPTURE_KERNEL CTL_CODE(FILE_DEVICE_DBGV, DWORD(0), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x00 //enable capture kernel
23+
#define DBGV_UNCAPTURE_KERNEL CTL_CODE(FILE_DEVICE_DBGV, DWORD(1), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x04 //
24+
#define DBGV_CLEAR_DISPLAY CTL_CODE(FILE_DEVICE_DBGV, DWORD(2), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x08 //clear display
25+
#define DBGV_READ_LOG CTL_CODE(FILE_DEVICE_DBGV, DWORD(3), METHOD_NEITHER, FILE_ANY_ACCESS) //0x0f //read kernel log
26+
#define DBGV_SET_PASSTHROUGH CTL_CODE(FILE_DEVICE_DBGV, DWORD(4), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x10 //enable passthrough
27+
#define DBGV_UNSET_PASSTHROUGH CTL_CODE(FILE_DEVICE_DBGV, DWORD(5), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x14 //
28+
#define DBGV_IS_DRIVER_AVAILABLE CTL_CODE(FILE_DEVICE_DBGV, DWORD(8), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x20 //test driver is valid or functional
29+
#define DBGV_GET_DRIVER_VERSION CTL_CODE(FILE_DEVICE_DBGV, DWORD(9), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x24 //driver version, 4.70 = 0x800
30+
#define DBGV_SET_CARRIAGE_RETURN CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0d), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x34 //force carriage return
31+
#define DBGV_UNSET_CARRIAGE_RETURN CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0e), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x38 //
32+
#define DBGV_SET_VERBOSE_MESSAGES CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x0f), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x3C //enable log verbose
33+
#define DBGV_UNSET_VERBOSE_MESSAGES CTL_CODE(FILE_DEVICE_DBGV, DWORD(0x10), METHOD_BUFFERED, FILE_ANY_ACCESS) //0x40 //reset log verbose
34+
35+
inline std::string feature_to_string(DWORD value)
36+
{
37+
switch (value)
38+
{
39+
case DBGV_CAPTURE_KERNEL: return "DBGV_CAPTURE_KERNEL";
40+
case DBGV_UNCAPTURE_KERNEL: return "DBGV_UNCAPTURE_KERNEL";
41+
case DBGV_CLEAR_DISPLAY: return "DBGV_CLEAR_DISPLAY";
42+
case DBGV_READ_LOG: return "DBGV_READ_LOG";
43+
case DBGV_SET_PASSTHROUGH: return "DBGV_SET_PASSTHROUGH";
44+
case DBGV_UNSET_PASSTHROUGH: return "DBGV_UNSET_PASSTHROUGH";
45+
case DBGV_IS_DRIVER_AVAILABLE: return "DBGV_IS_DRIVER_AVAILABLE";
46+
case DBGV_GET_DRIVER_VERSION: return "DBGV_GET_DRIVER_VERSION";
47+
case DBGV_SET_CARRIAGE_RETURN: return "DBGV_SET_CARRIAGE_RETURN";
48+
case DBGV_UNSET_CARRIAGE_RETURN: return "DBGV_UNSET_CARRIAGE_RETURN";
49+
case DBGV_SET_VERBOSE_MESSAGES: return "DBGV_SET_VERBOSE_MESSAGES";
50+
case DBGV_UNSET_VERBOSE_MESSAGES: return "DBGV_UNSET_VERBOSE_MESSAGES";
51+
default: break;
52+
}
53+
return std::to_string(value);
54+
}
3455

3556
// suppress the non-standard use of zero-sized array in struct/union
3657
#pragma warning(disable:4200)

application/include/DebugViewppLib/KernelReader.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@ class KernelReader : public PolledLogSource
2525
void Abort() override;
2626
bool AtEnd() const override;
2727

28+
void SetVerbose(bool value);
29+
void SetPassThrough(bool value);
30+
2831
private:
2932
void Poll() override;
3033

3134
void StartListening();
3235
void StopListening();
36+
void SetKernelMessagesDriverFeature(DWORD);
3337

3438
Win32::Handle m_handle;
3539
PLOG_ITEM m_pBuf;

0 commit comments

Comments
 (0)