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)
10 #define NTDDI_VERSION NTDDI_WIN7
12 // Please leave this temporary hack in place
13 // it's used to keep VS2015 happy for development.
26 EXTERN_C
int wmain(int argc
, WCHAR
*argv
[]);
29 LoadAndPrintString(ULONG MessageId
, ...)
34 if (Message
.LoadStringW(MessageId
))
36 va_start(args
, MessageId
);
37 vwprintf(Message
.GetBuffer(), args
);
43 PrintErrorText(_In_ ULONG ErrorCode
)
46 if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
54 wprintf(L
"%s\n", Buffer
);
59 SetDriverLoadPrivilege()
61 TOKEN_PRIVILEGES TokenPrivileges
;
65 DWORD dwError
= ERROR_SUCCESS
;
67 bSuccess
= OpenProcessToken(GetCurrentProcess(),
68 TOKEN_ADJUST_PRIVILEGES
,
70 if (bSuccess
== FALSE
)
71 return GetLastError();
73 if (!LookupPrivilegeValueW(NULL
, SE_LOAD_DRIVER_NAME
, &luid
))
74 return GetLastError();
76 TokenPrivileges
.PrivilegeCount
= 1;
77 TokenPrivileges
.Privileges
[0].Luid
= luid
;
78 TokenPrivileges
.Privileges
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
80 bSuccess
= AdjustTokenPrivileges(hToken
,
83 sizeof(TOKEN_PRIVILEGES
),
86 if (bSuccess
== FALSE
)
87 dwError
= GetLastError();
95 LoadFilter(_In_ LPWSTR FilterName
)
98 dwError
= SetDriverLoadPrivilege();
99 if (dwError
!= ERROR_SUCCESS
)
101 LoadAndPrintString(IDS_ERROR_PRIV
, HRESULT_FROM_WIN32(dwError
));
105 HRESULT hr
= FilterLoad(FilterName
);
108 LoadAndPrintString(IDS_ERROR_LOAD
, hr
);
114 UnloadFilter(_In_ LPWSTR FilterName
)
117 dwError
= SetDriverLoadPrivilege();
118 if (dwError
!= ERROR_SUCCESS
)
120 LoadAndPrintString(IDS_ERROR_PRIV
, HRESULT_FROM_WIN32(dwError
));
124 HRESULT hr
= FilterUnload(FilterName
);
127 LoadAndPrintString(IDS_ERROR_UNLOAD
, hr
);
133 PrintFilterInfo(_In_ PVOID Buffer
,
134 _In_ BOOL IsNewStyle
)
136 WCHAR FilterName
[128] = { 0 };
137 WCHAR Altitude
[64] = { 0 };
141 PFILTER_AGGREGATE_STANDARD_INFORMATION FilterAggInfo
;
142 FilterAggInfo
= (PFILTER_AGGREGATE_STANDARD_INFORMATION
)Buffer
;
144 if (FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
< 128)
146 CopyMemory(FilterName
,
147 (PCHAR
)FilterAggInfo
+ FilterAggInfo
->Type
.MiniFilter
.FilterNameBufferOffset
,
148 FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
);
149 FilterName
[FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
] = UNICODE_NULL
;
152 if (FilterAggInfo
->Type
.MiniFilter
.FilterNameLength
< 64)
155 (PCHAR
)FilterAggInfo
+ FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeBufferOffset
,
156 FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeLength
);
157 FilterName
[FilterAggInfo
->Type
.MiniFilter
.FilterAltitudeLength
] = UNICODE_NULL
;
160 wprintf(L
"%-38s %-10lu %-10s %-10lu\n",
162 FilterAggInfo
->Type
.MiniFilter
.NumberOfInstances
,
164 FilterAggInfo
->Type
.MiniFilter
.FrameID
);
168 PFILTER_FULL_INFORMATION FilterInfo
;
169 FilterInfo
= (PFILTER_FULL_INFORMATION
)Buffer
;
171 if (FilterInfo
->FilterNameLength
< 128)
173 CopyMemory(FilterName
,
174 FilterInfo
->FilterNameBuffer
,
175 FilterInfo
->FilterNameLength
);
176 FilterName
[FilterInfo
->FilterNameLength
] = UNICODE_NULL
;
179 wprintf(L
"%-38s %-10lu %-10lu\n",
181 FilterInfo
->NumberOfInstances
,
182 FilterInfo
->FrameID
);
192 BOOL IsNewStyle
= TRUE
;
195 hr
= FilterFindFirst(FilterAggregateStandardInformation
,
203 hr
= FilterFindFirst(FilterFullInformation
,
214 LoadAndPrintString(IDS_DISPLAY_FILTERS1
);
215 wprintf(L
"------------------------------ ------------- ------------ -----\n");
219 LoadAndPrintString(IDS_DISPLAY_FILTERS2
);
220 wprintf(L
"------------------------------ ------------- -----\n");
223 PrintFilterInfo(Buffer
, IsNewStyle
);
227 hr
= FilterFindNext(FindHandle
,
228 IsNewStyle
? FilterAggregateStandardInformation
: FilterFullInformation
,
234 PrintFilterInfo(Buffer
, IsNewStyle
);
237 } while (SUCCEEDED(hr
));
239 FilterFindClose(FindHandle
);
242 if (!SUCCEEDED(hr
) && hr
!= HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS
))
244 LoadAndPrintString(IDS_ERROR_PRIV
, hr
);
249 int wmain(int argc
, WCHAR
*argv
[])
253 LoadAndPrintString(IDS_USAGE
);
259 if (!_wcsicmp(argv
[1], L
"help"))
261 LoadAndPrintString(IDS_USAGE
);
263 else if (!_wcsicmp(argv
[1], L
"load"))
271 LoadAndPrintString(IDS_USAGE_LOAD
);
272 wprintf(L
"fltmc.exe load [name]\n\n");
275 else if (!_wcsicmp(argv
[1], L
"unload"))
279 UnloadFilter(argv
[2]);
283 LoadAndPrintString(IDS_USAGE_UNLOAD
);
284 wprintf(L
"fltmc.exe unload [name]\n\n");
287 else if (!_wcsicmp(argv
[1], L
"filters"))
295 LoadAndPrintString(IDS_USAGE_FILTERS
);
296 wprintf(L
"fltmc.exe filters\n\n");