随笔分类 -  读书笔记

摘要:Windows定义的Unicode数据类型有: WCHAR Unicode字符 PWSTR 指向Unicode字符串的指针 PCWSTR 指向一个恒定的Unicode字符串的指针相对应的ANSI数据类型有: CHAR ANSI字符 PSTR 指向ANSI字符串的指针 PCSTR 指向一个恒定的ANSI字符串的指针通用的字符数据类型: TCHAR PTSTR PCTSTR其中TCHAR的定义位于类TChar.h中,需要定义宏_UNICODE才能调用unicode数据类型。 PTSTR,PCTST的定义位于Windows.h头文件中,需要定义宏UNICODE才能调用unicode... 阅读全文
posted @ 2011-09-13 10:53 飞翔荷兰人 阅读(1967) 评论(0) 推荐(1)
摘要:EdwardLewisWe的博客——windows内核编程 阅读全文
posted @ 2011-08-11 12:07 飞翔荷兰人 阅读(474) 评论(0) 推荐(0)
摘要:3、文件读写在ring3 我们可以使用CreateFile、ReadFile 、WriteFile 等API,在ring0 同样很相似,不过函数变成了ZwCreateFile、ZwReadFile、ZwWriteFile 等内核函数。1)ZwCreateFile与ring3的CreateFile函数有所不同,它不能直接将需要打开或创建的文件路径传递过去,我们必须首先填写一个OBJECT_ATTRIBUTES结构。UNICODE_STRING str;OBJECT_ATTRIBUTES obj_attrib;RtlInitUnicodeString(&str, L"\\??\\ 阅读全文
posted @ 2011-08-11 11:14 飞翔荷兰人 阅读(1211) 评论(0) 推荐(0)
摘要:Windows 驱动程序分为两类:一类是不支持即插即用功能的NT式驱动程序;一类是支持即插即用功能的WDM驱动式程序。NT式1、Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数。WDM式的驱动程序要导入的头文件是WDM.h。代码 1 #ifdef __cplusplus 2 3 extern "C" 4 5 { 6 7 #endif 8 9 #include <NTDDK.h>10 11 #ifdef __cplus 阅读全文
posted @ 2011-08-11 11:05 飞翔荷兰人 阅读(720) 评论(0) 推荐(0)
摘要:1、字符串Unicode 字符串有一个结构体定义如下:typedef struct _UNICODE_STRING { USHORT Length; // 字符串的长度(字节数) USHORT MaximumLength; // 字符串缓冲区的长度(字节数) PWSTR Buffer; // 字符串缓冲区} UNICODE_STRING, *PUNICODE_STRING;需要注意的是,当我们定义了一个UNICODE_STRING 变量之后,它的Buffer 域还没有分配空间,因此我们不能直接赋值,好的做法是使用微软提供的Rtl 系列函数。 UNICODE_STRING str; R... 阅读全文
posted @ 2011-08-11 11:02 飞翔荷兰人 阅读(3968) 评论(0) 推荐(0)
摘要:堆非常适合分配大量的小型数据。它是用来管理链表和树的最佳方式。但是它分配和释放内存块的速度比虚拟内存和内存映射文件要慢,而且也无法再对物理存储器的调拨和撤销调拨进行直接控制。一个进程同时可以有多个堆,进程在整个生命周期内可以创建和销毁这些堆。但是,默认的堆是在进程开始运行之前由系统自动创建的,在进程终止后会自动销毁。我们无法销毁进程的默认堆。每个堆都有一个用来标识自己的堆句柄,所有分配和释放内存块的堆函数都会在参数中用到这个堆句柄。我们可以调用如下函数来得到进程默认堆得句柄:HANDLE WINAPI GetProcessHeap(void);创建额外的堆HANDLE WINAPI HeapC 阅读全文
posted @ 2011-08-10 11:29 飞翔荷兰人 阅读(633) 评论(0) 推荐(0)
摘要:在同一个可执行文件或dll的多个实例间共享静态数据1.创建自己的段:#pragma data_seg("Shared")LONG g_lApplocatinInstance= 0;#pragma data_seg()当编译器编译这段代码的时候,会创建一个名为Shared的段,并将pragma指示符之间所有带有初始值的变量放在这个段中。变量后面的#pragma data_seg()告诉编译器停止把后面的变量放到Shared段中,而是重新开始把它们放回到默认的数据段中。在visual C++中,编译器还提供了一个allocate声明符,它允许我们将未经初始化的数据放到任何我们想 阅读全文
posted @ 2011-08-10 11:28 飞翔荷兰人 阅读(668) 评论(0) 推荐(0)
摘要:当系统创建一个进程并赋予地址空间时,可用地址空间中的大部分是闲置的或尚未分配的。为了使用这部分地址空间,我们必须调用VirtualAlloc函数来分配其中的区域。分配区域的操作被称为“预定”。当应用程序预定地址空间区域时,系统会确保区域的起始地址正好是分配粒度的整数倍。分配粒度会根据不同的CPU平台而有所不同,但是到目前为止,所有的CPU平台都使用相同的分配粒度,大小为64KB。也就是说系统会把分配请求取整到64KB的整数倍。当应用程序预定地址空间的一块区域时,系统会确保区域的大小正好是系统页面大小的整数倍。页面是一个内存单元,系统通过它来管理内存。与分配粒度相似,页面大小会根据不同CPU而有 阅读全文
posted @ 2011-08-10 11:27 飞翔荷兰人 阅读(838) 评论(0) 推荐(0)
摘要:以异步方式调用函数为了用线程池来以异步的方式执行一个函数,我们需要定义一个具有以下原型的函数:VOID CALLBACK SimpleCallback( [in, out] PTP_CALLBACK_INSTANCE Instance, [in, out, optional] PVOID Context);然后为了让线程池中的一个线程来执行该函数,我们需要向线程池提交一个请求:BOOL WINAPI TrySubmitThreadpoolCallback( __in PTP_SIMPLE_CALLBACK pfns, __in_out_opt PVOID pv, __in_opt PTP_CA 阅读全文
posted @ 2011-08-10 11:25 飞翔荷兰人 阅读(3030) 评论(0) 推荐(0)
摘要:1.打开和关闭设备Windows的优势之一是它所支持的设备数量。就我们的讨论而言,我们把设备定义为能够与之进行通信的任何东西。表1列出了一些设备及其常见用途。表1:各种设备及其常见用途设备常见用途文件永久存储任何数据目录属性和文件压缩的设置逻辑磁盘驱动器格式化驱动器物理磁盘驱动器访问分区表串口通过电话线传输数据并口将数据传输至打印机邮件槽一对多数据传输,通常是通过网络传到另一台运行Windows的机器上命名管道一对一数据传输,通常是通过网络传到另一台运行Windows的机器上匿名管道单机上的一对一数据传输(绝对不会跨网络)套接字报文或数据流的传输,通常是通过网络传到任何支持套接字的机器上(机器 阅读全文
posted @ 2011-08-10 11:24 飞翔荷兰人 阅读(3945) 评论(0) 推荐(1)
摘要:等待函数等待函数使一个线程自愿进入等待,直到指定的内核对象被触发为止。DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); DWORD WaitForMultipleObjects( DWORD nCount, CONST HANDLE* lpHandles, BOOL fWaitAll, DWORD dwMilliseconds );时间内核对象创建时间内核对象:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualRes 阅读全文
posted @ 2011-08-10 11:23 飞翔荷兰人 阅读(612) 评论(0) 推荐(0)
摘要:原子访问:Interlocked系列函数所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。LONG InterlockedExchangeAdd( LONG volatile* Addend, LONG Value);LONGLONG InterlockedExchangeAdd64( LONGLONG volatile* Addend, LONGLONG Value);上面两个函数:参数Addend 为要递增或者递减的变量的地址参数Value为增量值,可以为负数,表示前一个变量参数递减。LONG InterlockedExchange( LONG 阅读全文
posted @ 2011-08-10 11:19 飞翔荷兰人 阅读(685) 评论(0) 推荐(0)
摘要:线程的挂起和恢复DWORDSuspendThread ( HANDLE hThread ); //挂起线程DWORDResumeThread ( HANDLE hThread ); //恢复线程SuspendThread和 ResumeThread 都返回之前的挂起计数。一个线程最多可以挂起MAXIMUM_SUSPEND_COUNT (WinNT.h中定义为127次)。进程的挂起和恢复对于Windows来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得cpu时间。但是我们可以创建一个函数,用来挂起或者恢复进程中的全部线程,这样就能挂起或者恢复一个进程了。参考代码如下:#include 阅读全文
posted @ 2011-08-10 11:18 飞翔荷兰人 阅读(10641) 评论(1) 推荐(2)
摘要:线程与进程的关系一般将进程定义成一个正在运行的程序的一个实例,它由以下两部分构成。一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。 一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,它还包含动态内存分配,比如线程堆栈和堆的分配。 进程要做任何事情,都必须让一个线程在它的上下文中运行。该线程负责执行进程地址空间包含的代码。事实上,一个进程可以有多个线程,所有线程都在进程的地址空间中“同时”执行代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创 阅读全文
posted @ 2011-08-09 14:47 飞翔荷兰人 阅读(1134) 评论(0) 推荐(0)
摘要:1.创建进程BOOL CreateProcess( LPCWSTR pszImageName, LPCWSTR pszCmdLine, LPSECURITY_ATTRIBUTES psaProcess, LPSECURITY_ATTRIBUTES psaThread, BOOL fInheritHandles, DWORDfdwCreate,LPVOID pvEnvironment, LPWSTR pszCurDir, LPSTARTUPINFOW psiStartInfo, LPPROCESS_INFORMATION pProcInfo); pszImageName :是要执行进程的路径名. 阅读全文
posted @ 2011-08-09 11:17 飞翔荷兰人 阅读(5527) 评论(0) 推荐(2)
摘要:1什么是内核对象 内核对象是内核分配的一段空间,如文件对象和进程对象等。可以用Windows提供的函数来创建相应的内核对象。创建成功后返回一个对象句柄,并且对象句柄值是进程相关的。程序不能直接操作内核对象,只能通过Windows提供的函数来控制。1.1内核对象的使用计数内核对象可以被多个进程同时使用,句柄值通常会不一样,但是引用的内容是同一块。内核对象的所有者是操作系统,而非进程,因此内核对象的存在时间通常会比进程的存在时间长。内核对象中有一个值用来保存当前使用该内核对象的进程数,这就是使用计数。这样可以确保在没有进程引用该对象时系统中不保留任何内核对象。内核对象由内核控制何时释放,而不是由. 阅读全文
posted @ 2011-08-09 09:37 飞翔荷兰人 阅读(1457) 评论(0) 推荐(1)
摘要:1.进程实例句柄加载到进程地址空间的每一个可执行文件或者dll文件都被赋予了一个独一无二的实例句柄.他实际上是一个内存基地址,系统将可执行程序的映像加载到进程地址空间中的这个位置。Ps :HMODULE和HINSTANCE 其实就是一回事.获得一个可执行文件或者dll文件的句柄/基地址:(1)GetModuleHandle函数HMODULE GetModuleHandle( LPCTSTRlpModuleName);调用这个函数时,参数指定了已在主调进程的地址空间中加载的一个可执行文件或者DLL文件的名称。或者参数为NULL时,会返回主调函数的可执行文件的基地址。(2)GetModuleHan 阅读全文
posted @ 2011-08-08 16:46 飞翔荷兰人 阅读(1555) 评论(0) 推荐(0)
摘要:显式的载入DLL模块HMODULE WINAPILoadLibrary( __inLPCTSTR lpFileName);HMODULE WINAPI LoadLibraryEx( __in LPCTSTR lpFileName, HANDLE hFile, __in DWORD dwFlags);hFile参数是为将来扩充所保留的,现在必须将它设为NULL;dwFlags 参数可以被设置为0,或者下列标志的组合:DONT_RESOLVE_DLL_REFERENCES,LOAD_IGNORE_CODE_AUTHZ_LEVEL, LOAD_LIBRARY_AS_DATAFILE, LOAD_LI 阅读全文
posted @ 2011-08-08 15:45 飞翔荷兰人 阅读(1865) 评论(0) 推荐(0)
摘要:.DLL和进程的地址空间创建DLL通常比创建应用程序容易,因为DLL通常由一组可供任何应用程序使用的独立函数组成。在DLL中,通常没有用来处理消息循环或创建窗口的代码。 DLL只不过是一组源代码模块,每个模块包含一些可供应用程序(可执行文件)或其他DLL调用的函数。在应用程序(或其他DLL)能够调用一个DLL中的函数之前,必须将该DLL的文件映像映射到调用进程的地址空间中。我们可以通过两种方法来达到这一目的:隐式载入时连接(implicit load-time linking)或显示运行时链接(explicit run-time linking)。 一旦系统将一个DLL的文件映像映射到调用进程 阅读全文
posted @ 2011-08-08 15:29 飞翔荷兰人 阅读(4205) 评论(0) 推荐(3)
摘要:Fly的博客地址: 网易Fly的博客 阅读全文
posted @ 2011-07-25 16:50 飞翔荷兰人 阅读(267) 评论(0) 推荐(0)

I Love Lina~