08 2011 档案

摘要:#pragma comment( comment-type [,"commentstring"] )该宏放置一个注释到对象文件或者可执行文件。comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。commentstring是一个提供为comment-type提供附加信息的字符串,Remarks:1、compiler:放置编译器的版本或者名字到一个对象文件,该选项是被linker忽略的。2、exestr:在以后的版本将被取消。3、lib:放置一个库搜索记录到对象文件中,这个类型应该是和commentstr 阅读全文
posted @ 2011-08-11 14:33 飞翔荷兰人 阅读(22500) 评论(2) 推荐(0)
摘要:EdwardLewisWe的博客——windows内核编程 阅读全文
posted @ 2011-08-11 12:07 飞翔荷兰人 阅读(476) 评论(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 飞翔荷兰人 阅读(1223) 评论(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 飞翔荷兰人 阅读(729) 评论(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 飞翔荷兰人 阅读(3975) 评论(0) 推荐(0)
摘要:/***************************************************************************** 原理:利用SCM组件服务方式加载驱动* 1、创建服务* 2、开启服务* 3、关闭服务* 4、删除服务*****************************************************************************//****************************************************************************** 函数名:LoadNTDri 阅读全文
posted @ 2011-08-11 10:40 飞翔荷兰人 阅读(982) 评论(0) 推荐(0)
摘要:堆非常适合分配大量的小型数据。它是用来管理链表和树的最佳方式。但是它分配和释放内存块的速度比虚拟内存和内存映射文件要慢,而且也无法再对物理存储器的调拨和撤销调拨进行直接控制。一个进程同时可以有多个堆,进程在整个生命周期内可以创建和销毁这些堆。但是,默认的堆是在进程开始运行之前由系统自动创建的,在进程终止后会自动销毁。我们无法销毁进程的默认堆。每个堆都有一个用来标识自己的堆句柄,所有分配和释放内存块的堆函数都会在参数中用到这个堆句柄。我们可以调用如下函数来得到进程默认堆得句柄:HANDLE WINAPI GetProcessHeap(void);创建额外的堆HANDLE WINAPI HeapC 阅读全文
posted @ 2011-08-10 11:29 飞翔荷兰人 阅读(637) 评论(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 飞翔荷兰人 阅读(672) 评论(0) 推荐(0)
摘要:当系统创建一个进程并赋予地址空间时,可用地址空间中的大部分是闲置的或尚未分配的。为了使用这部分地址空间,我们必须调用VirtualAlloc函数来分配其中的区域。分配区域的操作被称为“预定”。当应用程序预定地址空间区域时,系统会确保区域的起始地址正好是分配粒度的整数倍。分配粒度会根据不同的CPU平台而有所不同,但是到目前为止,所有的CPU平台都使用相同的分配粒度,大小为64KB。也就是说系统会把分配请求取整到64KB的整数倍。当应用程序预定地址空间的一块区域时,系统会确保区域的大小正好是系统页面大小的整数倍。页面是一个内存单元,系统通过它来管理内存。与分配粒度相似,页面大小会根据不同CPU而有 阅读全文
posted @ 2011-08-10 11:27 飞翔荷兰人 阅读(843) 评论(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 飞翔荷兰人 阅读(3039) 评论(0) 推荐(0)
摘要:1.打开和关闭设备Windows的优势之一是它所支持的设备数量。就我们的讨论而言,我们把设备定义为能够与之进行通信的任何东西。表1列出了一些设备及其常见用途。表1:各种设备及其常见用途设备常见用途文件永久存储任何数据目录属性和文件压缩的设置逻辑磁盘驱动器格式化驱动器物理磁盘驱动器访问分区表串口通过电话线传输数据并口将数据传输至打印机邮件槽一对多数据传输,通常是通过网络传到另一台运行Windows的机器上命名管道一对一数据传输,通常是通过网络传到另一台运行Windows的机器上匿名管道单机上的一对一数据传输(绝对不会跨网络)套接字报文或数据流的传输,通常是通过网络传到任何支持套接字的机器上(机器 阅读全文
posted @ 2011-08-10 11:24 飞翔荷兰人 阅读(3952) 评论(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 飞翔荷兰人 阅读(617) 评论(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 飞翔荷兰人 阅读(689) 评论(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 飞翔荷兰人 阅读(10656) 评论(1) 推荐(2)
摘要:线程与进程的关系一般将进程定义成一个正在运行的程序的一个实例,它由以下两部分构成。一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。 一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,它还包含动态内存分配,比如线程堆栈和堆的分配。 进程要做任何事情,都必须让一个线程在它的上下文中运行。该线程负责执行进程地址空间包含的代码。事实上,一个进程可以有多个线程,所有线程都在进程的地址空间中“同时”执行代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创 阅读全文
posted @ 2011-08-09 14:47 飞翔荷兰人 阅读(1144) 评论(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 飞翔荷兰人 阅读(5536) 评论(0) 推荐(2)
摘要:1什么是内核对象 内核对象是内核分配的一段空间,如文件对象和进程对象等。可以用Windows提供的函数来创建相应的内核对象。创建成功后返回一个对象句柄,并且对象句柄值是进程相关的。程序不能直接操作内核对象,只能通过Windows提供的函数来控制。1.1内核对象的使用计数内核对象可以被多个进程同时使用,句柄值通常会不一样,但是引用的内容是同一块。内核对象的所有者是操作系统,而非进程,因此内核对象的存在时间通常会比进程的存在时间长。内核对象中有一个值用来保存当前使用该内核对象的进程数,这就是使用计数。这样可以确保在没有进程引用该对象时系统中不保留任何内核对象。内核对象由内核控制何时释放,而不是由. 阅读全文
posted @ 2011-08-09 09:37 飞翔荷兰人 阅读(1465) 评论(0) 推荐(1)
摘要:1.进程实例句柄加载到进程地址空间的每一个可执行文件或者dll文件都被赋予了一个独一无二的实例句柄.他实际上是一个内存基地址,系统将可执行程序的映像加载到进程地址空间中的这个位置。Ps :HMODULE和HINSTANCE 其实就是一回事.获得一个可执行文件或者dll文件的句柄/基地址:(1)GetModuleHandle函数HMODULE GetModuleHandle( LPCTSTRlpModuleName);调用这个函数时,参数指定了已在主调进程的地址空间中加载的一个可执行文件或者DLL文件的名称。或者参数为NULL时,会返回主调函数的可执行文件的基地址。(2)GetModuleHan 阅读全文
posted @ 2011-08-08 16:46 飞翔荷兰人 阅读(1569) 评论(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 飞翔荷兰人 阅读(1877) 评论(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 飞翔荷兰人 阅读(4216) 评论(0) 推荐(3)
摘要:中文乱码打开Serv-U 10.3.0控制台,点击“限制和设置在FTP设置中找到OPTS UTF8命令,右击禁用此命令。点击下面的“全局属性”。在出来的FTP命令属性选项卡中,“高级选项”里,把“对所有收发的路径和文件名使用UFT-8编码”前面的钩去掉!用户管理权限在我们使用serv-u建立ftp用户时,会要求您选择管理权限,这里共有7种选择。那么每种选择的意思是什么。很多人不明白这里的权限指的是什么。其实这里的管理权限是针对远程登录serv-u ftp软件,管理ftp账户的管理员来说的。我们不仅可以在本地电脑通过双击serv-u tray.exe或者双击托盘图标来显示serv-u控制台,还可 阅读全文
posted @ 2011-08-05 16:55 飞翔荷兰人 阅读(4307) 评论(1) 推荐(1)
摘要:(1)先检查是否打开了所需端口方法:在桌面的开始菜单里,点“运行”,输入“cmd”进入DOS命令界面,输入“netstat -an”此时可以看到哪些端口已经打开。(2)打开端口方法:打开windows防火墙设置,点“例外”->“添加端口”,名称随便,端口号为你所需打开的,如“21”。(3)重启servu服务器如果不是端口问题,可以在servu控制管理台中,选择“域活动”->“日志”,里面会列出连接服务器时的相关信息。可以根据提示,修改参数。 阅读全文
posted @ 2011-08-05 16:11 飞翔荷兰人 阅读(2697) 评论(0) 推荐(0)
摘要:代码简化,促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字。 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。用法一:typedefint(*MYFUN)(int,int);这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int在分析这种形式的定义的时候可以用下面的方法:先去掉typedef 和别名,剩下的就是原变量的类型.去掉typedef和MYFUN以后就剩:int (*)(int, int)用法二:typedef给变量类型定义一个别名 阅读全文
posted @ 2011-08-04 15:41 飞翔荷兰人 阅读(1109) 评论(0) 推荐(0)
摘要:1.完成数组int[] a = {100,40, 60, 87, 34, 11, 56, 0}的快速排序、冒泡排序; 2.采用折半查找的算法,在数组中查询到某个数; 3.在中文环境下,有字符串,将其每个字节的数据相加求和。 4.将一个数组中值=0的项去掉,将不为0的值存入一个新的数组,比如: int a[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 生成的新数组为: int b[]={1,3,4,5,6,6,5,4,7,6,7,5} 5.定义10个长度的Student数组,将10个Student对象的年龄全部加1,然后把10个Student对象的详细信息逐行打印出. 阅读全文
posted @ 2011-08-03 15:41 飞翔荷兰人 阅读(9789) 评论(2) 推荐(0)
摘要:VS2010建的SDI/MDI与之前的不一样,是类似BCG的一些东西,所以用之前的方法GetMenu()得到CMenu是NULL或者无效。您可以在CMainFrame类中找到CMFCMenuBar m_wndMenuBar;这个成员变量,如果您将跟它相关的代码注释掉的话,然后再试试GetMenu()函数看看。 阅读全文
posted @ 2011-08-03 11:39 飞翔荷兰人 阅读(413) 评论(0) 推荐(0)
摘要:并不是所有字体,由TextOut函数输出都能形成路径, 通常像宋体、楷体_GB2312等TrueType类型的字体才可以, 有一个简单的判断方法,当你打开字体选择对话框时,只有字体 前有T符号标记的,才是TrueType字体,当然在CFontDialog中可以 指定只显示TrueType字体! 所以以下代码经测试通过! void CTextView::OnDraw(CDC* /*pDC*/){ CTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 CClien 阅读全文
posted @ 2011-08-02 10:04 飞翔荷兰人 阅读(435) 评论(0) 推荐(0)

I Love Lina~