关于 时间和定时器

这些东西 本来感觉没有什么搞得必要  但是 感觉很多书 都介绍了一些  我也就跟着做一下吧。。。。

获取系统的时间 这个 应该是是最简单的 

直接看代码 就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  如果是负数 就代表间隔多少时间 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值