@@ -37,7 +37,7 @@ def ZwAccessCheck(dp: Dumpulator,
3737 GrantedAccess : Annotated [P (ACCESS_MASK ), SAL ("_Out_" )],
3838 AccessStatus : Annotated [P (NTSTATUS ), SAL ("_Out_" )]
3939 ):
40- return STATUS_SUCCESS
40+ raise NotImplementedError ()
4141
4242@syscall
4343def ZwAccessCheckAndAuditAlarm (dp : Dumpulator ,
@@ -333,7 +333,7 @@ def ZwAllocateVirtualMemory(dp: Dumpulator,
333333 dp .memory .reserve (base , size , protect )
334334 dp .memory .commit (base , size )
335335 else :
336- assert False
336+ raise NotImplementedError ()
337337 return STATUS_SUCCESS
338338
339339@syscall
@@ -634,7 +634,7 @@ def ZwCancelTimer(dp: Dumpulator,
634634 TimerHandle : Annotated [HANDLE , SAL ("_In_" )],
635635 CurrentState : Annotated [P (BOOLEAN ), SAL ("_Out_opt_" )]
636636 ):
637- return STATUS_SUCCESS
637+ raise NotImplementedError ()
638638
639639@syscall
640640def ZwCancelTimer2 (dp : Dumpulator ,
@@ -775,6 +775,7 @@ def ZwContinue(dp: Dumpulator,
775775 ContextRecord : Annotated [P (CONTEXT ), SAL ("_In_" )],
776776 TestAlert : Annotated [BOOLEAN , SAL ("_In_" )]
777777 ):
778+ # Trigger a context switch
778779 assert not TestAlert
779780 exception = ExceptionInfo ()
780781 exception .type = ExceptionType .ContextSwitch
@@ -784,6 +785,12 @@ def ZwContinue(dp: Dumpulator,
784785 data = dp .read (ContextRecord .ptr , context_size )
785786 context = context_type .from_buffer (data )
786787 context .to_regs (dp .regs )
788+ # Modifying fs/gs also appears to reset fs_base/gs_base
789+ if dp .x64 :
790+ dp .regs .gs_base = dp .teb
791+ else :
792+ dp .regs .fs_base = dp .teb
793+ dp .regs .gs_base = dp .teb - 2 * PAGE_SIZE
787794 exception .context = dp ._uc .context_save ()
788795 return exception
789796
@@ -857,8 +864,14 @@ def ZwCreateEvent(dp: Dumpulator,
857864 InitialState : Annotated [BOOLEAN , SAL ("_In_" )]
858865 ):
859866 assert DesiredAccess == 0x1f0003
860- assert ObjectAttributes == 0
861- event = EventObject (EventType , InitialState )
867+ if ObjectAttributes != 0 :
868+ attributes = ObjectAttributes [0 ]
869+ assert attributes .ObjectName == 0
870+ assert attributes .RootDirectory == 0
871+ assert attributes .SecurityDescriptor == 0
872+ assert attributes .SecurityQualityOfService == 0
873+ assert attributes .Attributes == 2 # OBJ_INHERIT
874+ event = EventObject (EventType , InitialState != 0 )
862875 handle = dp .handles .new (event )
863876 EventHandle .write_ptr (handle )
864877 return STATUS_SUCCESS
@@ -2465,7 +2478,7 @@ def ZwOpenProcessToken(dp: Dumpulator,
24652478 assert ProcessHandle == dp .NtCurrentProcess ()
24662479 assert DesiredAccess == 0x20
24672480 # TODO: TokenHandle should be -6 or something
2468- handle = dp .handles .new (ProcessTokenHandle (ProcessHandle ))
2481+ handle = dp .handles .new (ProcessTokenObject (ProcessHandle ))
24692482 print (f"process token: { hex (handle )} " )
24702483 TokenHandle .write_ptr (handle )
24712484 return STATUS_SUCCESS
@@ -2495,7 +2508,7 @@ def ZwOpenSection(dp: Dumpulator,
24952508 DesiredAccess : Annotated [ACCESS_MASK , SAL ("_In_" )],
24962509 ObjectAttributes : Annotated [P (OBJECT_ATTRIBUTES ), SAL ("_In_" )]
24972510 ):
2498- return STATUS_NOT_IMPLEMENTED
2511+ raise NotImplementedError ()
24992512
25002513@syscall
25012514def ZwOpenSemaphore (dp : Dumpulator ,
@@ -2953,13 +2966,19 @@ def ZwQueryInformationProcess(dp: Dumpulator,
29532966 ProcessInformationLength : Annotated [ULONG , SAL ("_In_" )],
29542967 ReturnLength : Annotated [P (ULONG ), SAL ("_Out_opt_" )]
29552968 ):
2956- assert ( ProcessHandle == dp .NtCurrentProcess () )
2957- if ProcessInformationClass in [ PROCESSINFOCLASS .ProcessDebugPort , PROCESSINFOCLASS . ProcessDebugObjectHandle ] :
2969+ assert ProcessHandle == dp .NtCurrentProcess ()
2970+ if ProcessInformationClass == PROCESSINFOCLASS .ProcessDebugPort :
29582971 assert ProcessInformationLength == dp .ptr_size ()
29592972 dp .write_ptr (ProcessInformation .ptr , 0 )
29602973 if ReturnLength != 0 :
29612974 dp .write_ulong (ReturnLength .ptr , dp .ptr_size ())
29622975 return STATUS_SUCCESS
2976+ elif ProcessInformationClass == PROCESSINFOCLASS .ProcessDebugObjectHandle :
2977+ assert ProcessInformationLength == dp .ptr_size ()
2978+ dp .write_ptr (ProcessInformation .ptr , 0 )
2979+ if ReturnLength != 0 :
2980+ dp .write_ulong (ReturnLength .ptr , dp .ptr_size ())
2981+ return STATUS_PORT_NOT_SET
29632982 elif ProcessInformationClass == PROCESSINFOCLASS .ProcessDefaultHardErrorMode :
29642983 assert ProcessInformationLength == 4
29652984 dp .write_ulong (ProcessInformation .ptr , 1 )
@@ -2972,6 +2991,33 @@ def ZwQueryInformationProcess(dp: Dumpulator,
29722991 if ReturnLength .ptr :
29732992 dp .write_ulong (ReturnLength .ptr , 4 )
29742993 return STATUS_SUCCESS
2994+ elif ProcessInformationClass == PROCESSINFOCLASS .ProcessImageInformation :
2995+ sii = SECTION_IMAGE_INFORMATION (dp )
2996+ assert ProcessInformationLength == ctypes .sizeof (sii )
2997+ module = dp .modules [dp .modules .main ]
2998+ pe = module .pe
2999+ opt = pe .OPTIONAL_HEADER
3000+ sii .TransferAddress = module .entry
3001+ sii .ZeroBits = 0
3002+ sii .MaximumStackSize = opt .SizeOfStackReserve
3003+ sii .CommittedStackSize = opt .SizeOfStackCommit # TODO: more might be committed, check PEB
3004+ sii .SubSystemType = opt .Subsystem
3005+ sii .SubSystemMinorVersion = opt .MinorSubsystemVersion
3006+ sii .SubSystemMajorVersion = opt .MajorSubsystemVersion
3007+ sii .MinorOperatingSystemVersion = opt .MinorOperatingSystemVersion
3008+ sii .MajorOperatingSystemVersion = opt .MajorOperatingSystemVersion
3009+ sii .ImageCharacteristics = pe .FILE_HEADER .Characteristics # TODO
3010+ sii .DllCharacteristics = opt .DllCharacteristics # TODO
3011+ sii .Machine = pe .FILE_HEADER .Machine
3012+ sii .ImageContainsCode = 1
3013+ sii .ImageFlags = 1 # TODO
3014+ sii .LoaderFlags = 0 # TODO
3015+ sii .ImageFileSize = module .size # TODO: best we can do?
3016+ sii .CheckSum = opt .CheckSum
3017+ ProcessInformation .write (bytes (sii ))
3018+ if ReturnLength .ptr :
3019+ dp .write_ulong (ReturnLength .ptr , ctypes .sizeof (sii ))
3020+ return STATUS_SUCCESS
29753021 raise NotImplementedError ()
29763022
29773023@syscall
@@ -4437,7 +4483,7 @@ def ZwTerminateThread(dp: Dumpulator,
44374483 ExitStatus : Annotated [NTSTATUS , SAL ("_In_" )]
44384484 ):
44394485 assert ThreadHandle == dp .NtCurrentThread ()
4440- return STATUS_NOT_IMPLEMENTED
4486+ raise NotImplementedError ()
44414487
44424488@syscall
44434489def ZwTestAlert (dp : Dumpulator
0 commit comments