Process Monitor дает возможность непривилегированным приложениям передать своему драйверу строку Unicode длиной до 2048 символов. В справке приведен кода, который показывает, как передать отладочное сообщение (также в справке описано, что должно быть включено для отображения диагностических сообщений).
Я написал небольшой модуль для Delphi (2007), реализующий отладочный вывод сообщений в Process Monitor (по ссылке [3] можно найти похожую реализацию, тоже для Delphi). Джон Роббинс написал вспомогательный класс для управляемого кода ([2]).
unit uProcessMonitorTracing;
{******************************************************************************}
interface
{******************************************************************************}
uses Windows;
function ProcmonTraceMessage(const Message: WideString): Boolean;
{******************************************************************************}
implementation
{******************************************************************************}
const
METHOD_BUFFERED = 0;
FILE_WRITE_ACCESS = $0002;
FILE_DEVICE_PROCMON_LOG = $00009535;
const
szProcmonDevice: WideString = '\\.\Global\ProcmonDebugLogger';
var
IOCTL_EXTERNAL_LOG_DEBUGOUT: ULONG = 0;
function OpenProcmonDevice(): THandle;
begin
Result := CreateFileW(PWideChar(szProcmonDevice), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0)
end;
function ProcmonTraceMessage(const Message: WideString): Boolean;
var
hDevice: THandle;
fOk: BOOL;
cbSize, LastError: DWORD;
begin
fOk := False;
hDevice := OpenProcmonDevice();
if (hDevice <> INVALID_HANDLE_VALUE) then
begin
cbSize := 0;
fOk := DeviceIoControl(hDevice, IOCTL_EXTERNAL_LOG_DEBUGOUT, PWideChar(Message),
Length(Message) * SizeOf(WideChar), nil, 0, cbSize, nil);
if not fOk then
LastError := GetLastError();
CloseHandle(hDevice)
end
else
LastError := ERROR_BAD_DEVICE;
Result := fOk;
if not Result then
SetLastError(LastError)
end;
function CTL_CODE(nDeviceType, nFunction, nMethod, nAccess: DWORD): DWORD;
begin
Result := ((nDeviceType shl 16) or (nAccess shl 14) or
(nFunction shl 2) or nMethod)
end;
initialization
IOCTL_EXTERNAL_LOG_DEBUGOUT := CTL_CODE(FILE_DEVICE_PROCMON_LOG, $81,
METHOD_BUFFERED, FILE_WRITE_ACCESS);
end.Ссылки
[1] Updates: Process Monitor v2.9
[2] See the I/O You Caused by Getting Your Diagnostic Tracing into Process Monitor
[3] Interface unit for sending debug messages to SysInternals ProcessMonitor

Комментариев нет:
Отправить комментарий