Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char __cdecl PsValidateUserStack()
- {
- char Status; // al@1
- _KTRAP_FRAME *TrapFrame; // ecx@3
- _TEB *Teb; // ecx@3
- void *.Eip; // [sp+10h] [bp-88h]@3
- unsigned int .Esp; // [sp+14h] [bp-84h]@3
- void *StackLimit; // [sp+18h] [bp-80h]@3
- void *StackBase; // [sp+1Ch] [bp-7Ch]@3
- _EXCEPTION_RECORD ExitStatus; // [sp+24h] [bp-74h]@6
- CPPEH_RECORD ms_exc; // [sp+80h] [bp-18h]@3
- CurrentThread = (_ETHREAD *)__readfsdword(0x124u);
- Status = LOBYTE(CurrentThread->Tcb.___u42.UserAffinity.Reserved[0]);// // PreviousMode == User
- if ( Status )
- {
- __asm { bt dword ptr [edx+58h], 13h } // // KernelStackResident, ReadyTransition, Alertable
- Status = _CF;
- if ( _CF != 1 )
- {
- TrapFrame = CurrentThread->Tcb.TrapFrame;
- .Esp = TrapFrame->HardwareEsp;
- .Eip = (void *)TrapFrame->Eip;
- Teb = (_TEB *)CurrentThread->Tcb.Teb;
- ms_exc.disabled = 0;
- StackLimit = Teb->DeallocationStack;
- StackBase = Teb->NtTib.StackBase;
- ms_exc.disabled = -2;
- Status = .Esp;
- if ( .Esp < (unsigned int)StackLimit || .Esp >= (unsigned int)StackBase )
- {
- memset(&ExitStatus, 0, 0x50u);
- ExitStatus.ExceptionCode = STATUS_STACK_BUFFER_OVERRUN;
- ExitStatus.ExceptionAddress = .Eip;
- ExitStatus.NumberParameters = 2;
- ExitStatus.ExceptionInformation[0] = 4;
- ExitStatus.ExceptionInformation[1] = .Esp;
- Status = DbgkForwardException(&ExitStatus, 1, 1);
- if ( !Status )
- {
- Status = DbgkForwardException(&ExitStatus, 0, 1);
- if ( !Status )
- Status = ZwTerminateProcess((HANDLE)0xFFFFFFFF, ExitStatus.ExceptionCode);
- }
- }
- }
- }
- return Status;
- }
Advertisement
Add Comment
Please, Sign In to add comment