2 * PROJECT: ReactOS fltmc utility
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/fltmc/fltmc.c
5 * PURPOSE: Control utility for file system filter drivers
6 * PROGRAMMERS: Copyright 2016 Ged Murphy (gedmurphy@gmail.com)
9 // Please leave this temporary hack in place
10 // it's used to keep VS2015 happy for development.
23 EXTERN_C
int wmain(int argc
, WCHAR
*argv
[]);
26 LoadAndPrintString(ULONG MessageId
, ...)
31 if (Message
.LoadStringW(MessageId
))
33 va_start(args
, MessageId
);
34 vwprintf(Message
.GetBuffer(), args
);
40 PrintErrorText(_In_ ULONG ErrorCode
)
43 if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
51 wprintf(L
"%s\n", Buffer
);
56 SetDriverLoadPrivilege()
58 TOKEN_PRIVILEGES TokenPrivileges
;
62 DWORD dwError
= ERROR_SUCCESS
;
64 bSuccess
= OpenProcessToken(GetCurrentProcess(),
65 TOKEN_ADJUST_PRIVILEGES
,
67 if (bSuccess
== FALSE
)
68 return GetLastError();
70 if (!LookupPrivilegeValueW(NULL
, SE_LOAD_DRIVER_NAME
, &luid
))
71 return GetLastError();
73 TokenPrivileges
.PrivilegeCount
= 1;
74 TokenPrivileges
.Privileges
[0].Luid
= luid
;
75 TokenPrivileges
.Privileges
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
77 bSuccess
= AdjustTokenPrivileges(hToken
,
80 sizeof(TOKEN_PRIVILEGES
),
83 if (bSuccess
== FALSE
)
84 dwError
= GetLastError();
92 LoadFilter(_In_ LPWSTR FilterName
)
95 dwError
= SetDriverLoadPrivilege();
96 if (dwError
!= ERROR_SUCCESS
)
98 LoadAndPrintString(IDS_ERROR_PRIV
, HRESULT_FROM_WIN32(dwError
));
102 HRESULT hr
= FilterLoad(FilterName
);
105 LoadAndPrintString(IDS_ERROR_LOAD
, hr
);
111 UnloadFilter(_In_ LPWSTR FilterName
)
114 dwError
= SetDriverLoadPrivilege();
115 if (dwError
!= ERROR_SUCCESS
)
117 LoadAndPrintString(IDS_ERROR_PRIV
, HRESULT_FROM_WIN32(dwError
));
121 HRESULT hr
= FilterUnload(FilterName
);
124 LoadAndPrintString(IDS_ERROR_UNLOAD
, hr
);
130 PrintFilterInfo(_In_ PVOID Buffer
,
131 _In_ BOOL IsNewStyle
)
133 WCHAR FilterName
[128] = { 0 };
134 WCHAR Altitude
[64] = { 0 };
138 PFILTER_AGGREGATE_STANDARD_INFORMATION FilterAggInfo
;
139 FilterAggInfo
= (PFILTER_AGGREGATE_STANDARD_INFORMATION
)Buffer
;
141 if (FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
< 128)
143 CopyMemory(FilterName
,
144 (PCHAR
)FilterAggInfo
+ FilterAggInfo
->Type
.MiniFilter
.FilterNameBufferOffset
,
145 FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
);
146 FilterName
[FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
] = UNICODE_NULL
;
149 if (FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
< 64)
152 (PCHAR
)FilterAggInfo
+ FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeBufferOffset
,
153 FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeLength
);
154 FilterName
[FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeLength
] = UNICODE_NULL
;
157 wprintf(L
"%-38s %-10lu %-10s %-10lu\n",
159 FilterAggInfo
->Type
.MiniFilter
.NumberOfInstances
,
161 FilterAggInfo
->Type
.MiniFilter
.FrameID
);
165 PFILTER_FULL_INFORMATION FilterInfo
;
166 FilterInfo
= (PFILTER_FULL_INFORMATION
)Buffer
;
168 if (FilterInfo
->FilterNameLength
< 128)
170 CopyMemory(FilterName
,
171 FilterInfo
->FilterNameBuffer
,
172 FilterInfo
->FilterNameLength
);
173 FilterName
[FilterInfo
->FilterNameLength
] = UNICODE_NULL
;
176 wprintf(L
"%-38s %-10lu %-10lu\n",
178 FilterInfo
->NumberOfInstances
,
179 FilterInfo
->FrameID
);
189 BOOL IsNewStyle
= TRUE
;
192 hr
= FilterFindFirst(FilterAggregateStandardInformation
,
200 hr
= FilterFindFirst(FilterFullInformation
,
211 LoadAndPrintString(IDS_DISPLAY_FILTERS1
);
212 wprintf(L
"------------------------------ ------------- ------------ -----\n");
216 LoadAndPrintString(IDS_DISPLAY_FILTERS2
);
217 wprintf(L
"------------------------------ ------------- -----\n");
220 PrintFilterInfo(Buffer
, IsNewStyle
);
224 hr
= FilterFindNext(FindHandle
,
225 IsNewStyle
? FilterAggregateStandardInformation
: FilterFullInformation
,
231 PrintFilterInfo(Buffer
, IsNewStyle
);
234 } while (SUCCEEDED(hr
));
236 FilterFindClose(FindHandle
);
239 if (!SUCCEEDED(hr
) && hr
!= HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS
))
241 LoadAndPrintString(IDS_ERROR_PRIV
, hr
);
246 int wmain(int argc
, WCHAR
*argv
[])
250 LoadAndPrintString(IDS_USAGE
);
256 if (!_wcsicmp(argv
[1], L
"help"))
258 LoadAndPrintString(IDS_USAGE
);
260 else if (!_wcsicmp(argv
[1], L
"load"))
268 LoadAndPrintString(IDS_USAGE_LOAD
);
269 wprintf(L
"fltmc.exe load [name]\n\n");
272 else if (!_wcsicmp(argv
[1], L
"unload"))
276 UnloadFilter(argv
[2]);
280 LoadAndPrintString(IDS_USAGE_UNLOAD
);
281 wprintf(L
"fltmc.exe unload [name]\n\n");
284 else if (!_wcsicmp(argv
[1], L
"filters"))
292 LoadAndPrintString(IDS_USAGE_FILTERS
);
293 wprintf(L
"fltmc.exe filters\n\n");