рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪ рдФрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред рдПрдХ рд╕рд░рд▓, рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдореИрдВрдиреЗ рдПрдХ рдорд┐рдиреАрдлрд┐рд▓реНрдЯрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдорд┐рдиреАрдлрд┐рд▓реНрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рддрдерд╛рдХрдерд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдорд┐рдиреА рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рдиреЗ рдкрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рдмрдВрдзрдХ рд╕реАрдзреЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯреИрдХ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рдмрдВрдзрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдиреА рдлрд╝рд┐рд▓реНрдЯрд░ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдорд┐рдиреА-рдлрд┐рд▓реНрдЯрд░ рдЖрдИ / рдУ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрди рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдирд┐рдореНрди рдЖрд░реЗрдЦ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рдмрдВрдзрдХ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдЖрдк рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ MSDN рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд▓реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рд╡рд┐рдХрд╛рд╕ рдХреА рдУрд░ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рднрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ред
typedef struct _MINIFILTER { PDRIVER_OBJECT pDriverObject; PFLT_FILTER pFilter; } MINIFILTER, *PMINIFILTER; MINIFILTER fileManager;
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ PFLT_FILTER рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдорд┐рдиреА рдлрд┐рд▓реНрдЯрд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд▓рдХ рдХреА рдкреВрд░реА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд░рд╣рддрд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдпрд╛ рд░реЛрдХрддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд╝рд┐рд▓реНрдЯрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ
CONST FLT_REGISTRATION FilterRegistration = { sizeof( FLT_REGISTRATION ),
рдпрд╣рд╛рдБ рдпрд╣ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░реБрдХрдиреЗ рд▓рд╛рдпрдХ рд╣реИ:
- рдХреЙрд▓рдмреИрдХ - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдФрд░ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
- FilterUnload рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
- рдлрд╝рд┐рд▓реНрдЯрд░рд▓реЙрдб рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдЧрд▓рд╛, рдХреЙрд▓рдмреИрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
const FLT_OPERATION_REGISTRATION Callbacks[] = { { IRP_MJ_CREATE, 0, PreFileOperationCallback, PostFileOperationCallback }, { IRP_MJ_OPERATION_END } };
рдпрд╣рд╛рдВ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо CreateFile рдСрдкрд░реЗрд╢рди рдХреЛ рд░реЛрдХреЗрдВрдЧреЗ, рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреНрд░рдорд╢рдГ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдореИрдВ рдЙрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдФрд░ рдбрд┐рд╕реЗрдмрд▓ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
NTSTATUS FilterLoad (IN PCFLT_RELATED_OBJECTS FltObjects, IN FLT_INSTANCE_SETUP_FLAGS Flags, IN DEVICE_TYPE VolumeDeviceType, IN FLT_FILESYSTEM_TYPE VolumeFilesystemType) { if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM) { return STATUS_FLT_DO_NOT_ATTACH; } return STATUS_SUCCESS; } NTSTATUS FilterUnload ( IN FLT_FILTER_UNLOAD_FLAGS Flags ) { return STATUS_SUCCESS; }
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЕрдм рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрдВрдХреНрд╢рди рджреЗрдЦреЗрдВ:
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath ) { int i; NTSTATUS status; PCHAR ConfigInfo; UNICODE_STRING test; DbgPrint("MiniFilter: Started.");
рдорд┐рдиреА рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг FltRegisterFilter рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрдд theRriverObject рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, FilterRegademy рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдлрд╝рд╛рдЗрд▓ fileManager.pFilter рдХреЛ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ FltStartFiltering рдлрд╝рдВрдХреНрд╢рди (fileManager.pFilter) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдирд┐рдореНрди рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдХреЙрдиреНрдлрд╝рд┐рдЧрдЗрдиреНрдлреЛ = ReadConfigurationFile (); рдФрд░ ParseConfigurationFile (ConfigInfo), рдХреНрд░рдорд╢рдГред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдЧрд▓реЗ рд╕реЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
typedef struct FILE_REDIRECT_RULE { UNICODE_STRING From; UNICODE_STRING To; struct FILE_REDIRECT_RULE *NextRule; }FileRedirectRule, *PFileRedirectRule; struct PROCESS_CONFIGURATION_RULE { UNICODE_STRING ProcessName; struct FILE_REDIRECT_RULE *Rule; }; typedef struct CONFIGURATION_MAP { struct PROCESS_CONFIGURATION_RULE ProcessRule; struct REDIRECT_MAP *NextItem; }ConfigurationMap ,*PConfigurationMap;
рд╕рд┐рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ CONFIGURATION_MAP рд╣реИ, рдЬреЛ ProcessRule рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рд╕рд╛рде рд╣реА рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рднреА рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, PROCESS_CONFIGURATION_RULE рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реАрдзреЗ I / O рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдирд┐рдпрдо рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ REDIRECT_MAP рдХреА рддрд░рд╣ рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИред
рдбреНрд░рд╛рдЗрд╡рд░ рдЙрддрд╛рд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
VOID OnUnload( IN PDRIVER_OBJECT DriverObject ) { FltUnregisterFilter(fileManager.pFilter); FreeConfigInfo(); DbgPrint("MiniFilter: Unloaded"); }
рдпрд╣рд╛рдБ рд╣рдо рд╕рд┐рд░реНрдл рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЕрдирд░рдЬрд┐рд╕реНрдЯрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЗ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рдлреА рд╕рд░рд▓ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо PreFileOperationCallback рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред
FLT_PREOP_CALLBACK_STATUS PreFileOperationCallback ( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __deref_out_opt PVOID *CompletionContext ) { NTSTATUS status; PFILE_OBJECT FileObject; PFileRedirectRule redirectRuleItem; PFLT_FILE_NAME_INFORMATION pFileNameInformation; PConfigurationMap rule; UNICODE_STRING fullPath; UNICODE_STRING processName; PWCHAR Volume; FLT_PREOP_CALLBACK_STATUS returnStatus = FLT_PREOP_SUCCESS_NO_CALLBACK; if(FLT_IS_FS_FILTER_OPERATION(Data)) { return FLT_PREOP_SUCCESS_NO_CALLBACK; }
рд╣рдо рдореБрдЦреНрдп рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рднреА рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдо рдХреЙрд▓ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмреАрдПрд╕рдУрдбреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
if (FltObjects->FileObject != NULL && Data != NULL) { FileObject = Data->Iopb->TargetFileObject; if(FileObject != NULL && Data->Iopb->MajorFunction == IRP_MJ_CREATE) {
рдпрд╣рд╛рдВ рд╣рдо FilterManager рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред PFLT_CALLBACK_DATA рд╕рдВрд░рдЪрдирд╛ - рд╡рд░реНрддрдорд╛рди рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрд╢рди рдкрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╕рдордп FilterManager рдХреЛ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ PFLT_CALLBACK_DATA рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдбреЗрдЯрд╛-> Iopb-> TargetFileObject, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдУрдПрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред PCFLT_RELATED_OBJECTS - рдЗрд╕рдореЗрдВ I / O рдСрдкрд░реЗрд╢рди рд╕реЗ рдЬреБрдбрд╝реА рд╡рд╕реНрддреБрдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓, рдЕрдиреБрднрд╛рдЧ, рдЖрджрд┐ рдХрд╛ рд▓рд┐рдВрдХред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЬрд┐рд╕ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕рдХреЗ рддрддреНрд╡ рднрд░реЗ рд╣реБрдП рд╣реИрдВред рд╣рдо рдпрд╣ рднреА рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЬрд┐рд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдо рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ MJ_CREATE рд╣реИред
processName.Length = 0; processName.MaximumLength = NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof(WCHAR); processName.Buffer = ExAllocatePoolWithTag(NonPagedPool, processName.MaximumLength,CURRENT_PROCESS_TAG); RtlZeroMemory(processName.Buffer, processName.MaximumLength); status = GetProcessImageName(&processName);
рдХреЛрдб рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкрде рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдХреА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ WCHAR рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб GetProcessImageName рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░рд╛ рд░рд╛рд╕реНрддрд╛ рджреЗрддрд╛ рд╣реИ: \ Device \ HarddiskVolume4 \ Windows \ notepad.exeред рд╡рд╣ рд╣реИ, рдЕрдиреБрднрд╛рдЧ, рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрдеред
if(NT_SUCCESS(status)) { if(LoggingEnabled()== 1) { DbgPrint("MiniFilter: Process: %ws", processName.Buffer); } } else { return FLT_PREOP_SUCCESS_NO_CALLBACK; } rule = FindRuleByProcessName(&processName,GetRedirectionMap());
FindRuleByProcessName рдлрд╝рдВрдХреНрд╢рди, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдирд┐рдпрдореЛрдВ рд╕реЗ рдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ NULLред
ExFreePool(processName.Buffer); if(rule != NULL){ if(LoggingEnabled() == 1) { DbgPrint("MiniFilter: File name %ws", FileObject->FileName.Buffer); } redirectRuleItem = rule->ProcessRule.Rule;
рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдорд┐рд▓реА, рди рдХрд┐ NULLред redirectRuleItem = rule-> ProcessRule.Rule - рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧред
while(redirectRuleItem) { if(RtlCompareUnicodeString(&FileObject->FileName ,&redirectRuleItem->From, FALSE) == 0) { status = FltGetFileNameInformation( Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, &pFileNameInformation );
рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рд░реНрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рд╕ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, FltGetFileNameInformation рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
if(NT_SUCCESS(status)) { fullPath.Length = 0; fullPath.MaximumLength = NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof(WCHAR); fullPath.Buffer = ExAllocatePoolWithTag(NonPagedPool, fullPath.MaximumLength, FULL_PATH_TAG); RtlZeroMemory(fullPath.Buffer, fullPath.MaximumLength); Volume = wcssplt(pFileNameInformation->Volume.Buffer, redirectRuleItem->From.Buffer ); RtlAppendUnicodeToString(&fullPath, Volume); RtlAppendUnicodeToString(&fullPath, redirectRuleItem->To.Buffer); ExFreePool(Volume); ExFreePool(FileObject->FileName.Buffer);
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдмрдирд╛рдПрдВред рдЕрдВрддрд┐рдо рдкрде = рд╡рд░реНрддрдорд╛рди рдЕрдиреБрднрд╛рдЧ + рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ / рдУ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╣реИред
FileObject->FileName.Length = fullPath.Length; FileObject->FileName.MaximumLength = fullPath.MaximumLength; FileObject->FileName.Buffer = fullPath.Buffer; Data->Iopb->TargetFileObject->RelatedFileObject = NULL; Data->IoStatus.Information = IO_REPARSE; Data->IoStatus.Status = STATUS_REPARSE; DbgPrint("MiniFilter: Redirect done %ws", fullPath.Buffer); return FLT_PREOP_COMPLETE;
рдЕрдЧрд▓рд╛, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрдХ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗ, рд▓реЗрдХрд┐рди рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реАрд▓реНрдб рдХреЗ рдирд┐рдореНрди рдорд╛рдиреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдбреЗрдЯрд╛-> IoStatus.Information = IO_REPARSE рдФрд░ рдбреЗрдЯрд╛-> IoStatus.Status = STATUS_REPARSE ;, рд╕рд╛рде рд╣реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ FileObject-> FileName.Buffer = fullPath; рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, FLT_PROP_COMPLETE рд▓реМрдЯреЗрдВред
} } redirectRuleItem = redirectRuleItem->NextRule; } } } } return FLT_PREOP_SUCCESS_NO_CALLBACK; }
рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рд╕реВрдЪреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВрдЬрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FLT_PREOP_SUCCESS_NO_CALLBACK рд▓реМрдЯреЗрдВред
рдлрд┐рд▓рд╣рд╛рд▓, I / O рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдХрдИ рдЦрдВрдбреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдХреЛ рдбреАрдмрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдорд┐рдиреА рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рд░реВрдк рд╣реИ:
#minifilter config start { #logging : off #process : \Device\HarddiskVolume4\Windows\notepad.exe { #rule : redirect { #from : \test.txt #to : \data\test.txt } #rule : redirect { #from : \ioman.log #to : \IRCCL.ini } } }
рдлрд╝рд╛рдЗрд▓ рдХреЛ C рдбреНрд░рд╛рдЗрд╡ рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: minifilter.confред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ I / O рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП, рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрдВрддреНрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдбреЗрдЯрд╛-> IoStatus.Status = STATUS_ACCESS_DENIED; рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ FLT_PROP_COMPLETE рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред
рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдпрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ KMD рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдкреВрд▓рдЯреИрдЧ рдореЗрдореЛрд░реА рд▓реАрдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк DbgView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, Windows Vista рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдкрде рдореЗрдВ DWORD рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ HKEY_LOCAL_MACHINE \ SYSTEM \ Current \ontentrolSet \ Control \ Session Manager \ Debug Print рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╛рдо DEFAULT рдФрд░ рдорд╛рди рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВред 8ред
рд╡рд┐рдВрдбреЛрдЬ 7 рдХреЗ 64-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ F8 рджрдмрд╛рдПрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╡рд░реНрддрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдпрд╛ рдбреНрд░рд╛рдЗрд╡рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╡рд░реНрддрди рдУрд╡рд░рдбрд╛рдЗрдбрд░ (DSEO) рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЛрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдФрд░ рдирдХрд▓реА рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдбреНрд░рд╛рдЗрд╡рд░ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдЕрдВрддрддрдГ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рднрд▓реЗ рд╣реА рд▓реЙрдЧрд┐рдВрдЧ рд╕рдХреНрд╖рдо рд╣реЛ рдпрд╛ рдирд╣реАрдВ, DbgView рдореЗрдВ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдбрд┐рд╡рд╛рдЗрд╕рдЯреНрд░реА рдореЗрдВ рджрд┐рдЦреЗрдЧрд╛
рдореИрдВ рдпрд╣ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдЕрднреА рднреА рдХрд╛рдлреА рдХрдЪреНрдЪрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреАрдПрд╕рдУрдбреА рд╣реИ, рддреЛ рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ)ред рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬ 7 X86 рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 7 IA64 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рд╕реНрд░реЛрддреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
publish.rarрдХреНрдпрд╛ рдкрдврд╝реЗрдВ:- MSDN рдкреНрд░рд▓реЗрдЦрди
- рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдмреНрд▓реЙрдЧ
рдкреБрдирд╢реНрдЪред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдкреЗрд╢реЗрд╡рд░ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓реЗрдЦ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реЗ, рдореИрдВ Microsoft Dynamics CRM (.net, asp.net, рдЖрджрд┐) рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВред
рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред