找了個例子,可以從r3通過"呼叫門"切到r0.
人家r0的**用masm寫的, 用c寫也行.
r0中判斷未用的選擇子,從第一項開始(不是從第0項開始)
//
// #include "stdafx.h"
#include #include #include #include dword g_dwarypagedirbk[1024];//儲存頁表的全域性變數陣列
int main(int argc, char* argv)
; dword* pr0pagedir = (dword*)0xae100000;
int i = 0;
/**段選擇子是段暫存器的內容。
雖然386處理器中段暫存器還是16位的,但是在保護模式下,其內容的意義已經發生了變化,不再是表示段基位址,而是表示段描述符在描述符表中的位置。
其中第0位和第1位是rpl(request privilege level 請求特權級),用以進行訪問許可權檢查;
第2位是ti(task indication,任務指示),其值為0表示使用gdt,為1表示使用ldt;
第3至15位是段描述符在相應的描述符表中的索引。
*//** 呼叫門選擇子在驅動中已經新增了, 現在構造r3用的選擇子.
設驅動中呼叫門選擇子gdt索引為x
新選擇子值 = gdt索引值 | ti0 | rpl3
= (x << 3) | 0 | 3
驅動中列印的是 gdt index = 8
呼叫門的選擇子 = (x << 3) | 0 | 3
= (8 << 3) | 0 | 3
= 64 | 0 | 3
= 0x43
*/word farcall = ;
printf(">> call gate\r\n");
strcpy(szbuf, "after call gate, must use r0's function, crt function invalid\r\n");
outputdebugstring(szbuf);
_asm
// 現在已經是r0了, crt函式不好使了
// 這下面要呼叫r0的函式
printf("<< call gate\r\n"); ///< 不好使了
_asm
// 從呼叫門返回後,許可權是r0, 可以訪問r0的資源
for (i = 0; i < 1024; i++)
_asm
sprintf(szbuf, "page directory for the process, pid=%x\n", getcurrentprocessid());
outputdebugstring(szbuf); ///< 不好使了
for (i = 0; i < 1024; i++)
}outputdebugstring("end\r\n");
system("pause");
return0;}
; mycallgate.inc
include w2k\ntstatus.inc
include w2k\ntddk.inc
include w2k\ntoskrnl.inc
includelib d:\radasm
\masm32\lib
\w2k\ntoskrnl.lib
include d:\radasm
\masm32\macros
\strings.mac
callgate struct
offsetl dw 0
selector dw 0
dcount db 0
gtype db 0
offseth dw 0
callgate ends
; mycallgate.asm
.386
.model flat, stdcall
option casemap:none
include mycallgate.inc
.const
ccounted_unicode_string "\\device\\mycallgate",g_usdevicename,4
ccounted_unicode_string "\\??\\mycallgate",g_ussymboliclinkname,4
gdt_limit = 03ffh
gate_type = 0ech
.code
ring0fun proc
pushad
pushfd
cliinvoke dbgprint, $cta0("mycallgate function executed\n")
;add your code here, you can do anything if you like.
stipopfd
popad
retf
ring0fun endp
addcallgate proc funcaddr:ulong
pushfd
pushad
push esi
sgdt [esp-2]
pop esi
mov eax,8
xor ecx, ecx ; 插入的新選擇子 gdt表索引
.while eax < gdt_limit
lea edx,[esi+eax]
assume edx:ptr callgate
test [edx].gtype,80h
.if zero?
mov ebx,funcaddr
mov [edx].offsetl,bx
mov [edx].selector,08h
mov [edx].dcount,0
mov [edx].gtype,gate_type
shr ebx,16
mov [edx].offseth,bx
invoke dbgprint, $cta0("gdt index : [%d]\n"), ecx
.break
.endif
assume edx:nothing
add eax,8
inc ecx
.endw
popad
popfd
retaddcallgate endp
dispatchcontrol proc uses esi edi pdeviceobject:pdevice_object,pirp:pirp
mov esi,pirp
assume esi:ptr _irp
mov [esi].iostatus
.status ,status_success
and [esi].iostatus
.information,0
invoke iocompleterequest,pirp,0
mov eax,[esi].iostatus
.status
assume esi:nothing
retdispatchcontrol endp
driverunload proc pdriverobject:pdriver_object
invoke iodeletesymboliclink,addr g_ussymboliclinkname
mov eax,pdriverobject
invoke iodeletedevice,(driver_object ptr[eax]).deviceobject
retdriverunload endp
driverentry proc pdriverobject:pdriver_object,pusregistrypath:punicode_string
local status:ntstatus
local pdeviceobject:pdevice_object
mov status,status_device_configuration_error
invoke iocreatedevice,pdriverobject,0,addr g_usdevicename,file_device_unknown,0,false,addr pdeviceobject
.if eax == status_success
invoke iocreatesymboliclink ,addr g_ussymboliclinkname,addr g_usdevicename
.if eax == status_success
mov eax,pdriverobject
assume eax:ptr driver_object
mov ecx,irp_mj_maximum_function + 1
.while ecx
dec ecx
mov [eax].majorfunction[ecx * (sizeof pvoid)],offset dispatchcontrol
.endw
mov [eax].driverunload,offset driverunload
assume eax:nothing
invoke addcallgate,offset ring0fun
mov status,status_success
.else
invoke iodeletedevice,pdeviceobject
.endif
.endif
mov eax,status
retdriverentry endp
end driverentry
使用OutputDebugString除錯視窗程式
學程式設計是從dos下開始的,用了一定時間的tc2.0,使得養成了用printf輸出變數值進行除錯的壞習慣。到了寫視窗程式時,就遇到了些麻煩。視窗程式沒有方便的進行控制台輸出的方法 其實是我不知道 於是,用了幾年的用messagebox進行輸出的除錯手段,太麻煩了,因為messagebox會打斷程式...
Task3 模型調優
使用網格搜尋法對7個模型進行調優 調參時採用五折交叉驗證的方式 並進行模型評估 import pandas as pd import numpy as np from sklearn.model selection import gridsearchcv from sklearn.model sel...
jvm調優工具使用
要使用 visualgc 必須在遠端機上啟動jstatd 程式,否則會顯示 not supported for this jvm 錯誤 jstatd could not create remote object access denied j a.util.propertypermission j ...