这些东西 本来感觉没有什么搞得必要 但是 感觉很多书 都介绍了一些 我也就跟着做一下吧。。。。
获取系统的时间 这个 应该是是最简单的
直接看代码 就ok
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
SYSTEMTIME time;
::GetLocalTime(&time);
printf("现在的时间:%.2d:%.2d:%.2d\n", time.wHour, time.wMinute, time.wSecond);
getchar();
return 0;
}
关于 SYSTEMTIME 这个结构体 可以直接看声明
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
想打印那部分 就可以打印那部分。。。。。。。
有的 软件想省事 就用这种方法 来限制使用时间 。。。。。。。。。。
对抗这种方法最简单的就是直接 修改系统时间就ok了。。。。。
然后 就是定时器 这下面的代码是 windows 程序设计 第三版 的 源代码
#include <windows.h>
LRESULT __stdcall WndProc(HWND, UINT, WPARAM, LPARAM);
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
char szWindowClass[] = "Timer";
// 注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL;
::RegisterClassEx(&wcex);
// 创建并线程主窗口
HWND hWnd = ::CreateWindowEx(
WS_EX_CLIENTEDGE, // 扩展样式
szWindowClass, // 类名
"定时器的使用", // 标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, // 初始 X 坐标
CW_USEDEFAULT, // 初始 X 坐标
CW_USEDEFAULT, // 宽度
CW_USEDEFAULT, // 高度
NULL, // 父窗口句柄
NULL, // 菜单句柄
hInstance, // 程序实例句柄
NULL);
::ShowWindow(hWnd, nShowCmd);
::UpdateWindow(hWnd);
// 进入消息循环
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return 1;
}
#define IDT_TIMER1 1
// 消息处理函数
LRESULT __stdcall WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int nNum; // 计数
static int bSetTimer; // 指示是否安装了定时器
char szText[56];
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_CREATE: // 窗口正在被创建
bSetTimer = FALSE;
break;
case WM_PAINT: // 窗口客户区需要重画
hdc = ::BeginPaint(hWnd, &ps);
wsprintf(szText, "计数:%d", nNum);
::TextOut(hdc, 10, 10, szText, strlen(szText));
::EndPaint(hWnd, &ps);
break;
case WM_TIMER: // 定时器时间已到
if(wParam == IDT_TIMER1)
{
hdc = GetDC(hWnd);
wsprintf(szText, "计数:%d", nNum++);
::TextOut(hdc, 10, 10, szText, strlen(szText));
// 发一声“嘟”的声音
::MessageBeep(MB_OK);
}
break;
case WM_LBUTTONDOWN: // 用户单击鼠标左键
if(bSetTimer)
{
// 插销一个已经安装的定时器
::KillTimer(hWnd, IDT_TIMER1);
bSetTimer = FALSE;
}
else
{
// 安装一个时间周期为250ms的定时器
if(::SetTimer(hWnd, IDT_TIMER1, 250, NULL) == 0)
// SetTimer函数调用成功会返回新的定时器的ID号,失败的话返回0
{
::MessageBox(hWnd, "安装定时器失败!", "03Timer", MB_OK);
}
else
{
bSetTimer = TRUE;
}
}
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<ntddk.h>
#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 {
PDEVICE_OBJECT pDevice; //设备对象
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
LONG lTimerCount;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
VOID OnTimer(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context)
{
PDEVICE_EXTENSION pDevExt =
(PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
KdPrint(("Enter OnTimer!\n"));
InterlockedDecrement(&pDevExt->lTimerCount);
LONG previousCount = InterlockedCompareExchange
(&pDevExt->lTimerCount, TIMER_OUT, 0);
if (previousCount == 0)
{
KdPrint(("%d seconds time out!\n", TIMER_OUT));
}
PEPROCESS pEProcess = IoGetCurrentProcess();
PTSTR ProcessName = (PTSTR)((ULONG)pEProcess + 0x174);//即可得到用户进程
KdPrint(("The current process is %s\n", ProcessName));
}
VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;
KdPrint(("Enter DriverUnload\n"));
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
pNextObj->DeviceExtension;
//删除符号链接
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
IoDeleteDevice(pDevExt->pDevice);
}
KdPrint(("卸载完成!\n"));
}
NTSTATUS DeviceIOControl(IN PDEVICE_OBJECT pDriverObject,
IN PIRP pIrp)
{
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
ULONG Ilen = stack->Parameters.DeviceIoControl.InputBufferLength;
ULONG Olen = stack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
PDEVICE_EXTENSION pD_Extension = (PDEVICE_EXTENSION)pDriverObject->DeviceExtension;
ULONG info = 0;
switch (code)
{
case IOCTL_START_TIMER:
KdPrint(("开始调用 IOCTL_START_TIMER!\n"));
pD_Extension->lTimerCount = TIMER_OUT;
IoStartTimer(pDriverObject);
break;
case IOCTL_STOP:
KdPrint(("开始调用 IOCTL_STOP!\n"));
IoStopTimer(pDriverObject);
break;
default:
break;
}
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
)
{
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS CreatDriver(IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS ntstatus;
PDEVICE_OBJECT pDer_object;
PDEVICE_EXTENSION pDer_Etx;
UNICODE_STRING devname;
RtlInitUnicodeString(&devname, L"\\Device\\MyDDKDevice");
ntstatus = IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&devname,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&pDer_object);
if(!NT_SUCCESS(ntstatus))
{
return ntstatus;
}
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))
{
IoDeleteDevice(pDer_object);
return ntstatus;
}
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS status;
ULONG i;
pDriverObject->DriverUnload = Unload;
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
if (i == IRP_MJ_DEVICE_CONTROL)
pDriverObject->MajorFunction[i] = DeviceIOControl;
else
pDriverObject->MajorFunction[i] = DispatchRoutin;
}
status=CreatDriver(pDriverObject);
if (!NT_SUCCESS(status))
{
KdPrint(("创建设备失败!\n"));
}
return STATUS_SUCCESS;
}
#include <windows.h>
#include <stdio.h>
//使用CTL_CODE必须加入winioctl
#include <winioctl.h>
#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()
{
HANDLE hDevice =
CreateFile("\\\\.\\HelloDDK",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, // share mode none
NULL, // no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL ); // no template
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Failed to obtain file handle to device: "
"%s with Win32 error code: %d\n",
"MyWDMDevice", GetLastError() );
getchar();
return 1;
}
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 如果是负数 就代表间隔多少时间