341 lines
9.2 KiB
C
341 lines
9.2 KiB
C
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <dbt.h>
|
||
|
#include <initguid.h>
|
||
|
#include <devguid.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <sfcapip.h>
|
||
|
#include "resource.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CALLBACK
|
||
|
SfcNotificationCallback(
|
||
|
IN PFILEINSTALL_STATUS FileInstallStatus,
|
||
|
IN DWORD_PTR Context
|
||
|
)
|
||
|
{
|
||
|
wprintf( L"file=[%s], version=[%I64x], ec=[%d]\n", FileInstallStatus->FileName, FileInstallStatus->Version, FileInstallStatus->Win32Error );
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
PWSTR
|
||
|
addstr(
|
||
|
PWSTR s1,
|
||
|
PWSTR s2
|
||
|
)
|
||
|
{
|
||
|
wcscpy( s1, s2 );
|
||
|
return s1 + wcslen(s1) + 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
#define MemAlloc malloc
|
||
|
#define MemFree free
|
||
|
|
||
|
BOOL
|
||
|
MakeDirectory(
|
||
|
PCWSTR Dir
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Attempt to create all of the directories in the given path.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Dir - Directory path to create
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE for success, FALSE on error
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
LPTSTR p, NewDir;
|
||
|
BOOL retval;
|
||
|
|
||
|
|
||
|
NewDir = p = MemAlloc( (wcslen(Dir) + 1) *sizeof(WCHAR) );
|
||
|
if (p) {
|
||
|
wcscpy(p, Dir);
|
||
|
} else {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
if (*p != '\\') p += 2;
|
||
|
while( *++p ) {
|
||
|
while(*p && *p != TEXT('\\')) p++;
|
||
|
if (!*p) {
|
||
|
retval = CreateDirectory( NewDir, NULL );
|
||
|
MemFree(NewDir);
|
||
|
return(retval);
|
||
|
}
|
||
|
*p = 0;
|
||
|
retval = CreateDirectory( NewDir, NULL );
|
||
|
if (!retval && GetLastError() != ERROR_ALREADY_EXISTS) {
|
||
|
MemFree(NewDir);
|
||
|
return(retval);
|
||
|
}
|
||
|
*p = TEXT('\\');
|
||
|
}
|
||
|
|
||
|
MemFree( NewDir );
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
PVOID
|
||
|
RegisterForDevChange(
|
||
|
HWND hDlg
|
||
|
)
|
||
|
{
|
||
|
PVOID hNotifyDevNode;
|
||
|
DEV_BROADCAST_DEVICEINTERFACE FilterData;
|
||
|
|
||
|
|
||
|
FilterData.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
||
|
FilterData.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
||
|
FilterData.dbcc_classguid = GUID_DEVCLASS_CDROM;
|
||
|
|
||
|
hNotifyDevNode = RegisterDeviceNotification( hDlg, &FilterData, DEVICE_NOTIFY_WINDOW_HANDLE );
|
||
|
if (hNotifyDevNode == NULL) {
|
||
|
}
|
||
|
|
||
|
return hNotifyDevNode;
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR
|
||
|
CALLBACK
|
||
|
PromptForMediaDialogProc(
|
||
|
HWND hwndDlg,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
DEV_BROADCAST_VOLUME *dbv;
|
||
|
static UINT QueryCancelAutoPlay = 0;
|
||
|
static PVOID hNotifyDevNode = NULL;
|
||
|
|
||
|
if (uMsg == WM_INITDIALOG) {
|
||
|
hNotifyDevNode = RegisterForDevChange( hwndDlg );
|
||
|
QueryCancelAutoPlay = RegisterWindowMessage( L"QueryCancelAutoPlay" );
|
||
|
}
|
||
|
if (uMsg == WM_COMMAND && LOWORD(wParam) == IDCANCEL) {
|
||
|
UnregisterDeviceNotification( hNotifyDevNode );
|
||
|
EndDialog( hwndDlg, 0 );
|
||
|
}
|
||
|
if (uMsg == QueryCancelAutoPlay) {
|
||
|
SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, 1 );
|
||
|
return 1;
|
||
|
}
|
||
|
if (uMsg == WM_DEVICECHANGE) {
|
||
|
if (wParam == DBT_DEVICEARRIVAL) {
|
||
|
dbv = (DEV_BROADCAST_VOLUME*)lParam;
|
||
|
if (dbv->dbcv_devicetype == DBT_DEVTYP_VOLUME) {
|
||
|
//
|
||
|
// look for the cd
|
||
|
//
|
||
|
DWORD mask,i;
|
||
|
WCHAR Path[16];
|
||
|
WCHAR SourcePath[MAX_PATH];
|
||
|
Path[1] = L':';
|
||
|
Path[2] = L'\\';
|
||
|
Path[3] = 0;
|
||
|
Path[4] = 0;
|
||
|
for (i=0,mask=dbv->dbcv_unitmask; i<26; i++) {
|
||
|
if (mask&1) {
|
||
|
Path[0] = (WCHAR)(L'A' + i);
|
||
|
Path[3] = 0;
|
||
|
if (dbv->dbcv_flags == DBTF_MEDIA) {
|
||
|
if (GetDriveType( Path ) == DRIVE_CDROM) {
|
||
|
MessageBox( hwndDlg, L"CD was inserted, YEA BABY!", L"Windows File Protection", MB_OK );
|
||
|
UnregisterDeviceNotification( hNotifyDevNode );
|
||
|
EndDialog( hwndDlg, 1 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
mask = mask >> 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
int __cdecl wmain( int argc, WCHAR *argv[] )
|
||
|
{
|
||
|
HANDLE RpcHandle = NULL;
|
||
|
PROTECTED_FILE_DATA FileData;
|
||
|
PWSTR fnames;
|
||
|
PWSTR s;
|
||
|
BOOL b;
|
||
|
PROTECTED_FILE_DATA ProtFileData;
|
||
|
DWORD starttype;
|
||
|
DWORD quota;
|
||
|
WCHAR Path[MAX_PATH];
|
||
|
|
||
|
#if 0
|
||
|
GetPrivateProfileString(L"test",
|
||
|
L"path",
|
||
|
L"c:\\winnt\\system32",
|
||
|
Path,
|
||
|
sizeof(Path),
|
||
|
L"test.ini");
|
||
|
|
||
|
return MakeDirectory( Path );
|
||
|
#endif
|
||
|
|
||
|
if (argc == 2 && _wcsicmp(argv[1],L"/i")==0) {
|
||
|
RpcHandle = SfcConnectToServer( NULL );
|
||
|
s = fnames = (PWSTR) LocalAlloc( LPTR, 8192 );
|
||
|
s = addstr( s, L"%windir%\\system32\\admwprox.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\adsiis.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\certmap.ocx" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\certwiz.ocx" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\cnfgprts.ocx" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\coadmin.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\dt_ctrl.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\fscfg.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\ftpsapi2.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\iisext.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\iismap.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\iisreset.exe" );
|
||
|
s = addstr( s, L"%windir%\\system32\\iisrstap.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\iisrstas.exe" );
|
||
|
s = addstr( s, L"%windir%\\system32\\iisrtl.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\iisui.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\inetmgr.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\inetmgr.exe" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsloc.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\infoadmn.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\isatq.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\logui.ocx" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\nntpadm.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\nntpsnap.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\smtpadm.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\smtpsnap.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\staxmem.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\inetsrv\\w3scfg.dll" );
|
||
|
s = addstr( s, L"%windir%\\system32\\wamregps.dll" );
|
||
|
|
||
|
SfcInstallProtectedFiles( RpcHandle, fnames, TRUE, NULL, NULL, SfcNotificationCallback, 0 );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (argc == 2 && _wcsicmp(argv[1],L"/t")==0) {
|
||
|
RpcHandle = SfcConnectToServer( NULL );
|
||
|
b = SfcIsFileProtected( RpcHandle, L"%systemroot%\\system32\\kernel32.dll" );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (argc == 2 && _wcsicmp(argv[1],L"/x")==0) {
|
||
|
//RpcHandle = SfcConnectToServer( NULL );
|
||
|
ZeroMemory( &ProtFileData, sizeof(PROTECTED_FILE_DATA) );
|
||
|
ProtFileData.FileNumber = 24;
|
||
|
b = SfcGetNextProtectedFile( RpcHandle, &ProtFileData );
|
||
|
if (b) {
|
||
|
wprintf( L"%ws\n", ProtFileData.FileName );
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (argc == 2 && _wcsicmp(argv[1],L"/c")==0) {
|
||
|
DialogBoxParam(
|
||
|
GetModuleHandle(NULL),
|
||
|
MAKEINTRESOURCE(IDD_SFC_CD_PROMPT),
|
||
|
NULL,
|
||
|
PromptForMediaDialogProc,
|
||
|
0
|
||
|
);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (argc == 2 && _wcsicmp(argv[1],L"/p")==0) {
|
||
|
TCHAR DllPath[MAX_PATH];
|
||
|
HMODULE DllMod;
|
||
|
|
||
|
ExpandEnvironmentStrings(argv[2],DllPath,sizeof(DllPath)/sizeof(TCHAR));
|
||
|
DllMod = LoadLibrary(DllPath);
|
||
|
|
||
|
MoveFileEx(DllPath,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
|
||
|
|
||
|
FreeLibrary(DllMod);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
starttype = GetPrivateProfileInt(L"test",
|
||
|
L"starttype",
|
||
|
0,
|
||
|
L"test.ini");
|
||
|
|
||
|
quota = GetPrivateProfileInt(L"test",
|
||
|
L"quota",
|
||
|
0,
|
||
|
L"test.ini");
|
||
|
|
||
|
|
||
|
|
||
|
SfcInitProt( SFC_REGISTRY_OVERRIDE,
|
||
|
starttype,
|
||
|
SFC_SCAN_NORMAL,
|
||
|
quota,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
while (TRUE) {
|
||
|
if (WaitForSingleObject( NtCurrentProcess(), 1000 * 10 ) == WAIT_OBJECT_0) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (GetPrivateProfileInt(L"test",
|
||
|
L"shutdown",
|
||
|
0,
|
||
|
L"test.ini")) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
SfcTerminateWatcherThread();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
RpcHandle = SfcConnectToServer( NULL );
|
||
|
SfcInitiateScan( RpcHandle, 0 );
|
||
|
return 0;
|
||
|
|
||
|
RpcHandle = SfcConnectToServer( NULL );
|
||
|
SfcFileException( RpcHandle, argv[1], FILE_ACTION_REMOVED );
|
||
|
return 0;
|
||
|
|
||
|
RpcHandle = SfcConnectToServer( NULL );
|
||
|
FileData.FileNumber = 0;
|
||
|
|
||
|
while(SfcGetNextProtectedFile(RpcHandle,&FileData)) {
|
||
|
if (GetFileAttributes(FileData.FileName) != 0xffffffff) {
|
||
|
wprintf( L"File = %ws\n", FileData.FileName );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|