關於 時間和定時器

2021-09-10 02:06:03 字數 4351 閱讀 5625

這些東西 本來感覺沒有什麼搞得必要  但是 感覺很多書 都介紹了一些  我也就跟著做一下吧。。。。

獲取系統的時間 這個 應該是是最簡單的 

直接看** 就ok

#include "stdafx.h"

#include int _tmain(int argc, _tchar* ar**)

關於 systemtime 這個結構體 可以直接看宣告

typedef struct _systemtime  systemtime, *psystemtime, *lpsystemtime;
想列印那部分 就可以列印那部分。。。。。。。

有的 軟體想省事 就用這種方法 來限制使用時間 。。。。。。。。。。

對抗這種方法最簡單的就是直接 修改系統時間就ok了。。。。。

然後 就是定時器       這下面的**是 windows 程式設計 第三版 的 源**  

#include lresult __stdcall wndproc(hwnd, uint, wparam, lparam);

int __stdcall winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int nshowcmd)

return 1;

}#define idt_timer1 1

// 訊息處理函式

lresult __stdcall wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)

break;

case wm_lbuttondown: // 使用者單擊滑鼠左鍵

if(bsettimer)

else

else

}break;

case wm_close: // 使用者要求關閉視窗

if(bsettimer)

::killtimer(hwnd, idt_timer1);

break;

case wm_destroy: // 視窗正在被銷毀

::postquitmessage(0);

break;

} return ::defwindowproc(hwnd, message, wparam, lparam);

}

千萬不要以為   定時器 和sleep是等價的 ~~~~~~~ 這兩者是不同的

然後下面是 windows驅動開發技術詳解的 所寫的東西 

io 定時器 

#include#define timer_out	3

#define ioctl_stop ctl_code(\

file_device_unknown, \

0x801, \

method_in_direct, \

file_any_access)

#define ioctl_start_timer ctl_code(\

file_device_unknown, \

0x800, \

method_buffered, \

file_any_access)

typedef struct _device_extension device_extension, *pdevice_extension;

void ontimer(

in pdevice_object deviceobject,

in pvoid context)

peprocess peprocess = iogetcurrentprocess();

ptstr processname = (ptstr)((ulong)peprocess + 0x174);//即可得到使用者程序

kdprint(("the current process is %s\n", processname));

}void unload(in pdriver_object pdriverobject)

kdprint(("解除安裝完成!\n"));

}ntstatus deviceiocontrol(in pdevice_object pdriverobject,

in pirp pirp)

pirp->iostatus.status = status_success;

pirp->iostatus.information = info; // bytes xfered

iocompleterequest(pirp, io_no_increment);

return status_success;

}ntstatus dispatchroutin(in pdevice_object pdriverobject,

in pirp pirp

)ntstatus creatdriver(in pdriver_object pdriverobject)

pder_object->flags |= do_direct_io;

pder_etx = (pdevice_extension)pder_object->deviceextension;

pder_etx->pdevice = pder_object;

pder_etx->ustrdevicename = devname;

ioinitializetimer(pder_object, ontimer, null);

unicode_string symlinkname;

rtlinitunicodestring(&symlinkname, l"\\??\\helloddk");

pder_etx->ustrsymlinkname = symlinkname;

ntstatus = iocreatesymboliclink(&symlinkname, &devname);

if (!nt_success(ntstatus))

return status_success;

}ntstatus driverentry(

in pdriver_object pdriverobject,

in punicode_string pregistrypath)

status=creatdriver(pdriverobject);

if (!nt_success(status))

return status_success;

}

#include #include //使用ctl_code必須加入winioctl

#include #define ioctl_start_timer ctl_code(\

file_device_unknown, \

0x800, \

method_buffered, \

file_any_access)

#define ioctl_stop ctl_code(\

file_device_unknown, \

0x801, \

method_in_direct, \

file_any_access)

int main()

dword dwoutput;

deviceiocontrol(hdevice, ioctl_start_timer, null, 0, null, 0, &dwoutput, null);

sleep(10000);

deviceiocontrol(hdevice, ioctl_stop, null, 0, null, 0, &dwoutput, null);

closehandle(hdevice);

getchar();

getchar();

return 0;

}

這個是效果圖 

然後下面  第10章的內容等到 明天再寫  繼續擼pwn。。。。。。。。。。。。。

繼續往下寫  。。

io 計時器 太過古板  不夠靈活     那麼 下面就有了 dpc定時器  這個可以在任何時間都進行定時 

所謂的 dpc就是用定時器物件timer 當定時器設定乙個時間間隔後  沒過一段時間都會將乙個dpc 歷程 插入dpc佇列  

我猜這個dpc 佇列 和 apc佇列差不多    當間隔了這段時間 作業系統就會將乙個dpc 歷程插入dpc 佇列    當作業系統讀取dpc 佇列時  對應的dpc例程就會執行 

如果  時間是正數 那麼代表 就是絕對時間    比如人 1999 1 1  如果是負數 就代表間隔多少時間 

關於定時器

定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。計算機適合做那些很大量的簡單重複工作,或者根據請求做出回應。dos時代是沒有程序執行緒等概念的,那時候要想做到定時真是有些麻煩 通常的做法是死迴圈不斷監測時間,發現時間到了就做特定的事情 當然你可以用delay,來指定等...

關於定時器

今天突然想到乙個問題,如果要設定乙個5分鐘的定時器,那麼時間使用5 minute和5 60 second有什麼區別呢?或者說,設定成後者,程式會不會更累呢,會不會每秒鐘都去檢查下是不是到期了?於是去翻了一下golang原始碼中time的newtimer部分,如下 原來人家這兒用的是duration,...

nodejs 關於定時器 隨機時間

這裡設定時間為1 10分鐘內的隨機時間,早上8點到晚上23點結束 測試noide定時任務 var cron require cron var axios require axios var addmysql require db mysqlservice.js var datalist var da...