+136.7
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
BOOLEAN
KiCheckForAtlThunk (
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT Context
)
/*++
Routine Description:
This routine will determine whether an access violation was raised due to
an attempt to execute an ATL thunk in a no-execute, non-stack area.
If so, the thunk will be emulated and execution resumed.
Arguments:
ExceptionRecord - Supplies a pointer to an exception record.
Context - Supplies a pointer to a context frame.
Return Value:
TRUE - Context was updated to reflect the emulated ATL thunk, resume
execution.
FALSE - Not an ATL thunk, continue raising the exception.
--*/
//.........
//KiDispatchException:
//......
switch (ExceptionRecord->ExceptionCode) {
case STATUS_BREAKPOINT:
ContextFrame.Eip--;
break;
case KI_EXCEPTION_ACCESS_VIOLATION:
ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION;
if (PreviousMode == UserMode) {
if (KiCheckForAtlThunk(ExceptionRecord,&ContextFrame) != FALSE) {
goto Handled1;
}
//................
Объявление KiCheckForAtlThunk (втыкать в комменты и название =)) ) Для тех кто в танке: исходники Windows, оконные классы ATL выделяют тупо в хипе кусок-переходник, который заменяет HWND, идущий первым параметром в оконную процедуру, на естественный, объектно-ориентированный this. Так вот, если у нас установлено где-то в реестре юзать защиту от выполнения данных, то, естественно, в хипе хер чего выполнишь, и возникнет #GP, и тут-то нам и придет на помощь KiCheckForAtlThunk =) Короче, ИМХО, вносить изменения в ядро, для того, чтобы нормально работала криво написанная юзермодная библиотека -- та еще жесть =) Все кто минусует -- не шарят :P
Запостил: ISith,
30 Января 2010
guest 30.01.2010 14:19 # 0
guest 30.01.2010 15:11 # 0
Есть другие идеи как это починить, без перекомпиляции существующих программ?
ISith 30.01.2010 15:58 # 0