Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

340 lines
9.2 KiB

#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;
}