Windows 2000/XP และ 2003 สนับสนุนสิ่งที่เรียกว่า "โปรแกรมบริการ"
(1) คุณสามารถวิ่งได้โดยไม่ต้องเข้าสู่ระบบ
(2) มีสิทธิพิเศษของระบบ
เมื่อฉันพัฒนาโครงการ Set-Top Box สำหรับ บริษัท ในปี 2003 ฉันเขียน CourseWare Uploads และ Media Services
เรียกใช้ Delphi7, เลือกไฟล์เมนู-> ใหม่-> อื่น ๆ ---> แอปพลิเคชันบริการ เฟรมเวิร์ก
(1) DisplayName: ชื่อที่แสดงของบริการ
(2) ชื่อ: ชื่อบริการ
ที่นี่เราเปลี่ยนค่าของ DisplayName เป็น "Delphi Service Demo" และชื่อเป็น "Delphiservice" ตั้งอยู่ บริการและสถานะปัจจุบันจะปรากฏขึ้น กลับไปที่ IDE ของ Delphi7
แผนของเราคือการเพิ่มหน้าต่างหลักสำหรับบริการนี้ การทำงาน.
ในความเป็นจริงอย่าคิดว่าโปรแกรมบริการทำงานบนเดสก์ท็อป Winlogon ติ๊ก
ไฟล์-> ใหม่-> ฟอร์มเพิ่มหน้าต่าง frmmain ให้กับบริการบันทึกหน่วยเป็น unit_frmmain และตั้งค่าหน้าต่างนี้ที่จะสร้างด้วยตนเอง
หน่วยหน่วย _Main;
ส่วนต่อประสาน
ใช้
Windows, ข้อความ, sysutils, คลาส, กราฟิก, การควบคุม, svcmgr, กล่องโต้ตอบ, UNIT_FRMMAIN;
พิมพ์
tdelphiservice = class (tservice)
ขั้นตอน serviceContinue (ผู้ส่ง: tservice; var ต่อ: บูลีน);
ServiceExecute (ผู้ส่ง: tservice);
Procedure ServicePause (ผู้ส่ง: tservice; var หยุดชั่วคราว: บูลีน);
Serviceshutdown ขั้นตอน (ผู้ส่ง: tservice);
ขั้นตอน servicestart (ผู้ส่ง: tservice; var เริ่มต้น: บูลีน);
ServiceStop ขั้นตอน (ผู้ส่ง: tservice; var หยุด: บูลีน);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
ฟังก์ชั่น GetServiceController: TserviceController;
{ประกาศสาธารณะ}
จบ;
วาจา
Delphiservice: Tdelphiservice;
frmmain: tfrmmain;
การดำเนินการ
{$ r *.dfm}
ServiceController (CTRLCODE: DWORD);
เริ่ม
Delphiservice.Controller (CtrlCode);
จบ;
ฟังก์ชั่น tdelphiservice.getServiceController: tserviceController;
เริ่ม
ผลลัพธ์: = serviceController;
จบ;
ขั้นตอน tdelphiservice.serviceContinue (ผู้ส่ง: tservice;
VAR ดำเนินการต่อ: บูลีน);
เริ่ม
ในขณะที่ไม่สิ้นสุดทำ
เริ่ม
นอนหลับ (10);
ServiceThread.processRequests (เท็จ);
จบ;
จบ;
ขั้นตอน tdelphiservice.serviceExecute (ผู้ส่ง: tservice);
เริ่ม
ในขณะที่ไม่สิ้นสุดทำ
เริ่ม
นอนหลับ (10);
ServiceThread.processRequests (เท็จ);
จบ;
จบ;
ขั้นตอน tdelphiservice.servicepause (ผู้ส่ง: tservice;
var หยุดชั่วคราว: บูลีน);
เริ่ม
หยุดชั่วคราว: = จริง;
จบ;
ขั้นตอน tdelphiservice.serviceshutdown (ผู้ส่ง: tservice);
เริ่ม
gbcanclose: = true;
frmmain.free;
สถานะ: = csstopped;
reportstatus ();
จบ;
ขั้นตอน tdelphiservice.servicestart (ผู้ส่ง: tservice;
VAR เริ่มต้น: บูลีน);
เริ่ม
เริ่มต้น: = จริง;
svcmgr.application.createform (tfrmmain, frmmain);
gbcanclose: = false;
frmmain.hide;
จบ;
ขั้นตอน tdelphiservice.servicestop (ผู้ส่ง: tservice;
var หยุด: บูลีน);
เริ่ม
หยุด: = จริง;
gbcanclose: = true;
frmmain.free;
จบ;
จบ.
หน่วยหน้าต่างหลักมีดังนี้:
UNIT ONIT_FRMMAIN;
ส่วนต่อประสาน
ใช้
Windows, ข้อความ, sysutils, ตัวแปร, คลาส, shellapi, กราฟิก, การควบคุม, รูปแบบ,
กล่องโต้ตอบ, extctrls, stdctrls;
const
WM_TRAYICON = WM_USER + 1234;
พิมพ์
tfrmmain = คลาส (tform)
ตัวจับเวลา 1: ttimer;
ปุ่ม 1: tbutton;
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: tobject);
ขั้นตอน formcloseQuery (ผู้ส่ง: tobject; var canchlose: บูลีน);
FORMDESTROY ขั้นตอน (ผู้ส่ง: TOBJECT);
ขั้นตอน Timer1Timer (ผู้ส่ง: tobject);
ขั้นตอน button1click (ผู้ส่ง: tobject);
ส่วนตัว
{ประกาศส่วนตัว}
icondata: tnotifyicondata;
ขั้นตอน addicontotray;
ขั้นตอน deliconFromtray;
ขั้นตอน trayiconMessage (var msg: tmessage); ข้อความ WM_TRAYICON;
ขั้นตอน sysbuttonmsg (var msg: tmessage); ข้อความ WM_SYSCOMMAND;
สาธารณะ
{ประกาศสาธารณะ}
จบ;
วาจา
frmmain: tfrmmain;
Gbcanclose: บูลีน;
การดำเนินการ
{$ r *.dfm}
ขั้นตอน tfrmmain.formcreate (ผู้ส่ง: tobject);
เริ่ม
formstyle: = fsstayontop; {ด้านหน้าของหน้าต่าง}
SetWindowLong (Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
gbcanclose: = false;
timer1.interval: = 1,000;
timer1.enabled: = true;
จบ;
ขั้นตอน tfrmmain.formclosequery (ผู้ส่ง: tobject; var canclose: บูลีน);
เริ่ม
anclose: = gbcanclose;
ถ้าไม่ยกเลิกแล้ว
เริ่ม
ซ่อน;
จบ;
จบ;
ขั้นตอน tfrmmain.formdestroy (ผู้ส่ง: tobject);
เริ่ม
timer1.enabled: = false;
DeliconFromtray;
จบ;
ขั้นตอน tfrmmain.addicontotray;
เริ่ม
Zeromemory (@icondata, sizeof (tnotifyicondata));
icondata.cbsize: = sizeof (tnotifyicondata);
icondata.wnd: = handle;
icondata.uid: = 1;
icondata.uflags: = nif_message หรือ nif_icon หรือ nif_tip;
ICONDATA.UCALLBACKMESSAGE: = WM_TRAYICON;
icondata.hicon: = application.icon.handle;
icondata.sztip: = 'โปรแกรมสาธิตบริการ Delphi';
shell_notifyicon (nim_add, @icondata);
จบ;
ขั้นตอน tfrmmain.deliconfromtray;
เริ่ม
shell_notifyicon (nim_delete, @icondata);
จบ;
ขั้นตอน tfrmmain.sysbuttonmsg (var msg: tmessage);
เริ่ม
ถ้า (msg.wparam = sc_close) หรือ
(msg.wparam = sc_minimize) จากนั้นซ่อน
อื่นที่สืบทอดมา;
จบ;
ขั้นตอน tfrmmain.trayiconmessage (var msg: tmessage);
เริ่ม
if (msg.lparam = wm_lbutondblclk) แล้วแสดง ();
จบ;
ขั้นตอน tfrmmain.timer1timer (ผู้ส่ง: tobject);
เริ่ม
addicontotray;
จบ;
ขั้นตอน sendhokkey; stdcall;
วาจา
hdesk_wl: hdesk;
เริ่ม
hdesk_wl: = openDesktop ('winlogon', 0, false, desktop_journalplayback);
ถ้า (hdesk_wl <> 0) แล้ว
if (setthreaddesktop (hdesk_wl) = true) แล้ว
postmessage (hwnd_broadcast, wm_hotkey, 0, makelong (mod_alt หรือ mod_control, vk_delete));
จบ;
ขั้นตอน tfrmmain.button1click (ผู้ส่ง: tobject);
วาจา
dwthreadid: dword;
เริ่ม
createThread (nil, 0, @SendHokkey, nil, 0, dwthreadid);
จบ;
จบ.
เติมเต็ม:
(1) สำหรับโปรแกรมการสาธิตโปรแกรมบริการเพิ่มเติมกรุณาเยี่ยมชม URL ต่อไปนี้: http://www.torry.net/pages.php?id=226 ซึ่งมีรหัสหลายรหัสที่แสดงวิธีการควบคุมและจัดการบริการระบบ
(2) โปรดจำไว้ว่า: Windows มีเดสก์ท็อปหลาย ๆ ตัว มันอยู่บนเดสก์ท็อปตัวป้องกันหน้าจอในเวลานี้คุณต้องเปลี่ยนหน้าจอปัจจุบันไปยังเดสก์ท็อป
(3) นอกจากนี้ยังมีวิธีการสลับแบบไดนามิกสำหรับการโต้ตอบระหว่างโปรแกรมบริการและเดสก์ท็อป
หน่วย ServiceDesktop;
ส่วนต่อประสาน
ฟังก์ชั่น initServiceDesktop: บูลีน;
ขั้นตอน DoneserviceDesktop;
การดำเนินการ
ใช้ windows, sysutils;
const
defaultWindowStation = 'winsta0';
defaultDeskTop = 'default';
วาจา
Hwinstasave: Hwinsta;
Hdesksave: Hdesk;
Hwinstauser: Hwinsta;
Hdeskuser: Hdesk;
ฟังก์ชั่น initServiceDesktop: บูลีน;
วาจา
dwthreadid: dword;
เริ่ม
dwthreadid: = getCurrentThreadId;
// ตรวจสอบให้แน่ใจว่าเชื่อมต่อกับสถานีบริการหน้าต่างและเดสก์ท็อปและ
// บันทึกที่จับของพวกเขา
Hwinstasave: = getProcessWindowStation;
hdesksave: = getthreaddesktop (dwthreadid);
hwinstauser: = openwindowstation (defaultWindowStation, false, maximum_allowed);
ถ้า hwinstauser = 0 แล้ว
เริ่ม
outputDebugString (pchar ('openwindowstation ล้มเหลว' + syserrorMessage (getLasterror)));
ผลลัพธ์: = เท็จ;
ออก;
จบ;
ถ้าไม่ใช่ setProcessWindowStation (hwinstauser) แล้ว
เริ่ม
OutputDebugString ('SetProcessWindowStation ล้มเหลว');
ผลลัพธ์: = เท็จ;
ออก;
จบ;
hdeskuser: = openDesktop (defaultdesktop, 0, false, maximum_allowed);
ถ้า hdeskuser = 0 แล้ว
เริ่ม
OutputDebugString ('OpenDesktop ล้มเหลว');
SetProcessWindowStation (Hwinstasave);
CloseWindowStation (Hwinstauser);
ผลลัพธ์: = เท็จ;
ออก;
จบ;
ผลลัพธ์: = setThreadDeskTop (hdeskuser);
ถ้าไม่ผลลัพธ์แล้ว
outputDebugString (pchar ('setthreaddesktop' + syserrorMessage (getLasterror)));
จบ;
ขั้นตอน DoneserviceDesktop;
เริ่ม
// กู้คืนสถานีหน้าต่างและเดสก์ท็อป
SetThreadDeskTop (hdesksave);
SetProcessWindowStation (Hwinstasave);
ถ้า hwinstauser <> 0 แล้ว
CloseWindowStation (Hwinstauser);
ถ้า hdeskuser <> 0 แล้ว
closeSktop (hdeskuser);
จบ;
การเริ่มต้น
InitServiceDesktop;
การสรุป
DoneserviceDesktop;
จบ.
สำหรับรหัสสาธิตรายละเอียดเพิ่มเติมโปรดดูที่: http://www.torry.net/samples/samples/os/isarticle.zip
(4) วิธีเพิ่มคำอธิบายบริการเกี่ยวกับวิธีการติดตั้งบริการ ตอนนี้เราอยู่ใน HKEY_LOCAL_MACHINE/SYSTEM/CONTROLSET001 ดังนี้:
หน่วย winsvcex;
ส่วนต่อประสาน
ใช้ Windows, WinSVC;
const
-
// ระดับข้อมูลการกำหนดค่าบริการ
-
service_config_description = 1;
service_config_failure_actions = 2;
-
// dll ชื่อของฟังก์ชั่นนำเข้า
-
advapidll = 'advapi32.dll';
พิมพ์
-
// สตริงคำอธิบายบริการ
-
pserviceDescriptiona = ^tserviceDescriptiona;
pserviceDescriptionw = ^tserviceDescriptionw;
pserviceDescription = pserviceDescriptiona;
{$ externalsym _service_descriptiona}
_service_descriptiona = บันทึก
lpdescription: Pansichar;
จบ;
{$ externalsym _service_descriptionw}
_service_descriptionw = บันทึก
LPDESCRIPTION: PWIDECHAR;
จบ;
{$ externalsym _service_description}
_service_description = _service_descriptiona;
{$ externalsym service_descriptiona}
service_descriptiona = _service_descriptiona;
{$ externalsym service_descriptionw}
service_descriptionw = _service_descriptionw;
{$ externalsym service_description}
service_description = _service_descriptiona;
tserviceDescriptiona = _service_descriptiona;
tserviceDescriptionw = _service_descriptionw;
tserviceDescription = tserviceDescriptiona;
-
// การกระทำที่จะดำเนินการกับความล้มเหลวของบริการ
-
{$ externalsym _sc_action_type}
_SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_ROBOOT, SC_ACTION_RUN_COMMAND);
{$ externalSym SC_ACTION_TYPE}
SC_ACTION_TYPE = _SC_ACTION_TYPE;
pserviceAction = ^tserviceAction;
{$ externalsym _sc_action}
_sc_action = บันทึก
atype: sc_action_type;
ความล่าช้า: dword;
จบ;
{$ externalSym SC_Action}
sc_action = _sc_action;
tserviceAction = _sc_action;
pservicefailureaactionsa = ^tservicefailureaxtionsa;
pserviceFailureaxtionsw = ^tserviceFailureaxtionsw;
pserviceFailureactions = pserviceFailureaxtionsa;
{$ externalsym _service_failure_actionsa}
_service_failure_actionsa = บันทึก
dwresetperiod: dword;
lprebootmsg: LPSTR;
LPCOMMAND: LPSTR;
cactions: dword;
lpsaactions: ^sc_action;
จบ;
{$ externalsym _service_failure_actionsw}
_service_failure_actionsw = บันทึก
dwresetperiod: dword;
lprebootmsg: lpwstr;
LPCOMMAND: LPWSTR;
cactions: dword;
lpsaactions: ^sc_action;
จบ;
{$ externalsym _service_failure_actions}
_service_failure_actions = _service_failure_actionsa;
{$ externalsym service_failure_actionsa}
service_failure_actionsa = _service_failure_actionsa;
{$ externalsym service_failure_actionsw}
service_failure_actionsw = _service_failure_actionsw;
{$ externalsym service_failure_actions}
service_failure_actions = _service_failure_actionsa;
tserviceFailureaactionsa = _service_failure_actionsa;
tserviceFailureactionsw = _service_failure_actionsw;
tserviceFailureactions = tserviceFailureaxtionsa;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////
// ต้นแบบฟังก์ชัน API
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////
TQUERYSERVICECONFIG2 = ฟังก์ชั่น (HSERVICE: SC_HANDLE; DWINFOLEVEL: DWORD; LPBUFFER: ตัวชี้;
CBBUFSIZE: DWORD;
tchangeserviceConfig2 = ฟังก์ชั่น (hservice: sc_handle; dwinfolevel: dword; lpinfo: pointer): bool; stdcall;
วาจา
HDLL: Thandle;
libloaded: บูลีน;
วาจา
OsversionInfo: TosversionInfo;
{$ externalsym queryServiceConfig2a}
QueryServiceConfig2A: TQUERYSERVICECONFIG2;
{$ externalsym queryServiceConfig2w}
QueryServiceConFig2W: TQUERYSERVICECONFIG2;
{$ externalsym queryServiceConfig2}
QueryServiceConFig2: TQUERYSERVICECONFIG2;
{$ externalSym changeServiceConfig2a}
ChangeServiceConfig2a: tchangeserviceConfig2;
{$ externalSym changeServiceConfig2w}
ChangeServiceConfig2W: tchangeserviceConfig2;
{$ externalSym ChangeServiceConfig2}
ChangeServiceConfig2: tchangeserviceConfig2;
การดำเนินการ
การเริ่มต้น
OsversionInfo.dwosversionInfosize: = sizeof (OsversionInfo);
GetVersionex (OsversionInfo);
if (osversionInfo.dwplatformid = ver_platform_win32_nt) และ (osversioninfo.dwmajorversion> = 5) จากนั้น
เริ่ม
ถ้า hdll = 0 แล้ว
เริ่ม
hdll: = getModuleHandle (advapidll);
libloaded: = false;
ถ้า hdll = 0 แล้ว
เริ่ม
hdll: = loadlibrary (advapidll);
libloaded: = true;
จบ;
จบ;
ถ้า hdll <> 0 แล้ว
เริ่ม
@queryServiceConfig2a: = getProcaddress (hdll, 'queryserviceConfig2a');
@queryServiceConFig2W: = getProcaddress (hdll, 'queryServiceConfig2w');
@queryServiceConfig2: = @queryServiceConFig2a;
@changeServiceConfig2a: = getProcaddress (hdll, 'changeServiceConfig2a');
@ChangeServiceConfig2W: = getProcaddress (HDLL, 'ChangeSerViceConFig2W');
@changeServiceConfig2: = @changeServiceConfig2a;
จบ;
จบ
อื่น
เริ่ม
@queryserviceConfig2a: = nil;
@queryServiceConfig2w: = nil;
@queryServiceConfig2: = nil;
@changeServiceConfig2a: = nil;
@changeServiceConfig2w: = nil;
@changeServiceConfig2: = nil;
จบ;
การสรุป
ถ้า (hdll <> 0) และ libloaded แล้ว
Freelibrary (HDLL);
จบ.
หน่วย Winntservice;
ส่วนต่อประสาน
ใช้
Windows, WinSVC, WinSVCEX;
ฟังก์ชั่น InstallService (const strservicename, strdisplayname, strdescription, strfilename: string): บูลีน;
// เช่น: InstallService ('ชื่อบริการ', 'ชื่อแสดง', 'คำอธิบายข้อมูล', 'ไฟล์บริการ');
ขั้นตอนการถอนการติดตั้ง (strservicename: String);
การดำเนินการ
ฟังก์ชั่น strlcopy (dest: pchar; const ที่มา: pchar; maxlen: cardinal): pchar;
asm
ผลัก edi
ดัน ESI
ดัน EBX
MOV ESI, EAX
mov edi, edx
mov ebx, ecx
Xor al, AL
ทดสอบ ECX, ECX
jz @@ 1
repne scasb
jne @@ 1
Inc ecx
@@ 1: sub ebx, ecx
mov edi, esi
MOV ESI, EDX
mov edx, edi
mov ecx, ebx
Shr ecx, 2
ตัวแทน movsd
mov ecx, ebx
และ ecx, 3
ตัวแทน movsb
Stosb
Mov Eax, edx
ป๊อป ebx
ป๊อป esi
ป๊อป edi
จบ;
ฟังก์ชั่น strpchar (dest: pchar; const ที่มา: สตริง): pchar;
เริ่ม
ผลลัพธ์: = strlcopy (dest, pchar (แหล่งที่มา), ความยาว (แหล่งที่มา));
จบ;
ฟังก์ชั่น InstallService (const strservicename, strdisplayname, strdescription, strfilename: string): บูลีน;
วาจา
// SS: Tservicestatus;
// PSTEMP: PCHAR;
HSCM, HSCS: Thandle;
SRVDESC: PSERVITEDESCRIPTION;
DESC: String;
// srvtype: dword;
LpserviceArgVectors: PCHAR;
เริ่ม
ผลลัพธ์: = เท็จ;
// PSTEMP: = NIL;
// srvtype: = service_win32_own_process และ service_interactive_process;
HSCM: = OpenScManager (NIL, NIL, SC_MANAGER_ALL_ACCESS); // เชื่อมต่อฐานข้อมูลบริการ
ถ้า hscm = 0 จากนั้นออก; // messagebox (hhandle, pchar (syserrormessage (getlasterror)), 'ผู้จัดการโปรแกรมบริการ', mb_iconerror+mb_topmost);
hscs: = createService (// สร้างฟังก์ชันบริการ
HSCM, // จัดการการจัดการการควบคุมบริการ
pchar (strservicename), // ชื่อบริการ
pchar (strdisplayname), // ชื่อบริการที่แสดง
service_all_access, // สิทธิ์การเข้าถึง
service_win32_own_process หรือ service_interactive_process, // ประเภทบริการ service_win32_share_process
service_auto_start, // ประเภทเริ่มต้น
service_error_ignore, // ประเภทการควบคุมข้อผิดพลาด
pchar (strfilename), // โปรแกรมบริการ
ไม่มีชื่อบริการกลุ่ม
Nil, // id กลุ่ม
Nil, // บริการขึ้นอยู่กับ
ไม่มี // เริ่มบัญชีบริการ
ไม่มี); // เริ่มรหัสผ่านบริการ
ถ้า hscs = 0 จากนั้นออก; // messagebox (hhandle, pchar (syserrormessage (getlasterror)), pchar (application.title), mb_iconerror+mb_topome);
หากได้รับมอบหมาย (ChangeSviceConFig2) แล้ว
เริ่ม
desc: = copy (strdescription, 1,1024);
getMem (srvdesc, sizeof (tserviceDescription));
getMem (srvdesc^.lpdescription, ความยาว (desc) + 1);
พยายาม
strpcopy (srvdesc^.lpdescription, desc);
ChangeServiceConfig2 (HSCs, service_config_description, srvdesc);
ในที่สุด
Freemem (srvdesc^.lpdescription);
Freemem (SRVDESC);
จบ;
จบ;
lpserviceArgVectors: = nil;
หากไม่ได้เริ่มต้น (hscs, 0, lpserviceargvectors) แล้ว // เริ่มบริการ
ออก;
ปิดเซิร์ฟเวอร์ (hscs);
ผลลัพธ์: = จริง;
จบ;
ขั้นตอนการถอนการติดตั้ง (strservicename: String);
วาจา
ScManager: SC_HANDLE;
บริการ: sc_handle;
สถานะ: Tservicestatus;
เริ่ม
ScManager: = openScManager (ไม่มี, NIL, SC_MANAGER_ALL_ACCESS);
ถ้า scmanager = 0 จากนั้นออก;
พยายาม
บริการ: = openService (ScManager, PCHAR (strservicename), service_all_access);
ControlService (บริการ, service_control_stop, สถานะ);
Deleteservice (บริการ);
CloseserviceHandle (บริการ);
ในที่สุด
CloseserviceHandle (ScManager);
จบ;
จบ;
จบ.
(5) วิธีปิดโปรแกรมการบริการอย่างไร้ความปราณีและตระหนักถึงฟังก์ชั่นของ "กล่องเครื่องมือ NT" ก่อนหน้าของเราก่อนการฆ่ากระบวนการตามชื่อกระบวนการคือการใช้ฟังก์ชั่นต่อไปนี้:
ใช้ tlhelp32;
ฟังก์ชั่น killtask (exefilename: string): จำนวนเต็ม;
const
process_terminate = $ 0001;
วาจา
Continueloop: บูล;
FSNAPSHOTHANDLE: THANDLE;
fprocessentry32: tprocessentry32;
เริ่ม
ผลลัพธ์: = 0;
fsnapshothandle: = createToolhelp32snapshot (Th32cs_snapprocess, 0);
fprocessentry32.dwsize: = sizeof (fprocessentry32);
Continueloop: = Process32 First (FSNAPSHOTHANDLE, FPROCESSENTRY32);
ในขณะที่จำนวนเต็ม (Continueloop) <> 0 ทำ
เริ่ม
if ((uppercase (extractfilename (fprocessentry32.szexefile)) = =
ตัวพิมพ์ใหญ่ (exefilename)) หรือ (ตัวพิมพ์ใหญ่ (fprocessentry32.szexefile) =
ตัวพิมพ์ใหญ่ (exefilename)) จากนั้น
ผลลัพธ์: = จำนวนเต็ม (สิ้นสุดการประมวลผล (
OpenProcess (process_terminate,
บูล (0)
fprocessentry32.th32processid),
0));
Continueloop: = Process32NEXT (FSNAPSHOTHANDLE, FPROCESSENTRY32);
จบ;
CloseHandle (FSNAPSHOTHANDLE);
จบ;
อย่างไรก็ตามสำหรับโปรแกรมบริการมันจะแจ้งให้ "การเข้าถึงการเข้าถึง"
ฟังก์ชั่นเปิดใช้งาน BugPrivilege: บูลีน;
ฟังก์ชั่น enablePrivilege (htoken: cardinal; privname: string; benable: boolean): บูลีน;
วาจา
TP: token_privileges;
หุ่น: พระคาร์ดินัล;
เริ่ม
tp.privileGecount: = 1;
lookupprivilegevalue (nil, pchar (ชื่อส่วนตัว), tp.privileges [0] .luid);
ถ้าเบ็นได้แล้ว
tp.privileges [0] .attributes: = se_privilege_enabled
อื่น ๆ tp.privileges [0] .attributes: = 0;
AdjustTokenPrivileges (htoken, false, tp, sizeof (tp), nil, dummy);
ผลลัพธ์: = getLasterRor = error_success;
จบ;
วาจา
htoken: พระคาร์ดินัล;
เริ่ม
OpenProcessToken (getCurrentProcess, TOKEN_ADJUST_PRIVILESS, HTOKEN);
ผลลัพธ์: = enablePrivilege (htoken, 'sedebugprivilege', จริง);
ภาพใกล้ชิด (htoken);
จบ;
วิธีใช้:
enabledebugprivilege; // ยกระดับสิทธิ์
killtask ('xxxx.exe'); // ปิดโปรแกรมบริการ
------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------ ----------