-
Notifications
You must be signed in to change notification settings - Fork 17
/
TmTxTracker.dpr
75 lines (61 loc) · 2.02 KB
/
TmTxTracker.dpr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
library TmTxTracker;
{$R *.res}
{$WEAKLINKRTTI ON}
uses
Ntapi.ntdef in 'NtUtils\Headers\Ntapi.ntdef.pas',
Ntapi.ntexapi in 'NtUtils\Headers\Ntapi.ntexapi.pas',
Ntapi.ntkeapi in 'NtUtils\Headers\Ntapi.ntkeapi.pas',
Ntapi.ntmmapi in 'NtUtils\Headers\Ntapi.ntmmapi.pas',
Ntapi.ntpebteb in 'NtUtils\Headers\Ntapi.ntpebteb.pas',
Ntapi.ntrtl in 'NtUtils\Headers\Ntapi.ntrtl.pas',
Ntapi.ntstatus in 'NtUtils\Headers\Ntapi.ntstatus.pas',
Ntapi.nttmapi in 'NtUtils\Headers\Ntapi.nttmapi.pas',
Winapi.NtSecApi in 'NtUtils\Headers\Winapi.NtSecApi.pas',
Winapi.WinBase in 'NtUtils\Headers\Winapi.WinBase.pas',
Winapi.WinNt in 'NtUtils\Headers\Winapi.WinNt.pas';
var
FutureTransaction: THandle;
{$IFDEF Debug}
function ReportState(Reason: Integer): NTSTATUS;
var
TidStr: UNICODE_STRING;
Buffer: array [0..10] of WideChar;
begin
Result := STATUS_SUCCESS;
case Reason of
DLL_PROCESS_ATTACH:
OutputDebugStringW('TmTxTracker: attached to process');
DLL_PROCESS_DETACH:
OutputDebugStringW('TmTxTracker: detached from process');
DLL_THREAD_ATTACH, DLL_THREAD_DETACH:
begin
TidStr.Length := 0;
TidStr.MaximumLength := SizeOf(Buffer);
TidStr.Buffer := PWideChar(@Buffer);
FillChar(Buffer, SizeOf(Buffer), 0);
Result := RtlIntegerToUnicodeString(Cardinal(
NtCurrentTeb.ClientId.UniqueThread), 10, TidStr);
case Reason of
DLL_THREAD_ATTACH:
OutputDebugStringW(PWideChar('TmTxTracker: attached to thread ' +
TidStr.ToString));
DLL_THREAD_DETACH:
OutputDebugStringW(PWideChar('TmTxTracker: detached from thread ' +
TidStr.ToString));
end;
end;
end;
end;
{$ENDIF}
procedure DllMain(Reason: Integer);
begin
if (Reason = DLL_THREAD_ATTACH) and (FutureTransaction <> 0) then
RtlSetCurrentTransaction(FutureTransaction);
{$IFDEF Debug} ReportState(Reason); {$ENDIF}
end;
exports
FutureTransaction, DllMain;
begin
DllProc := DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.