
c++
文章平均质量分 87
zacklin
这个作者很懒,什么都没留下…
展开
-
NTSYSAPI NTSTATUS NTAPI
NTSYSAPINTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess);Winnt.h里有 #define NTSYSAPI DECLSPEC_IMPORT 。对于这么一个NativeAPI,我们使用前必须声明。使用NTSYSAPI表明P原创 2012-04-12 13:26:24 · 2056 阅读 · 0 评论 -
Sleep、SleepEx
Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行。SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行:I/O完成回调函数被调用、异步过程调用(APC)被安排进入线程中。函数原型:VOID WINAPI Sleep( DWORD dwMillseconds);DWORD WIN原创 2012-04-13 13:27:52 · 7637 阅读 · 0 评论 -
#ifdef __cplusplus 倒底是什么意思?
时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif 这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代原创 2012-04-13 14:01:33 · 503 阅读 · 0 评论 -
RemoveHeadList 宏定义
如果查看DDK头文件,会发现有几个内核函数是以宏的方式实现的。这种宏中有几个宏的定义是相当糟糕的。例如,我们看到RemoveHeadList的定义如下:#define RemoveHeadList(ListHead) (ListHead)->Flink; {RemoveEntryList((ListHead)->Flink)}如果以以下方式调用Rem原创 2012-04-13 15:20:47 · 1869 阅读 · 0 评论 -
一个简单的NT驱动之创建设备对象函数(CreateDevice)
/***************************************************************** 函数名称:CreateDrivce* 功能描述:初始化设备对象* 参数列表: pDriverObject:从I/O管理器中传进来的驱动对象* 返回值:返回初始化状态*************************************原创 2012-04-13 17:16:43 · 1970 阅读 · 0 评论 -
wcslen与lstrlen如何区别
size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); int lstrlen( LPCTSTR lpString // string to count ); strlen()返回ANSI字符串长度; wcslen()返回宽字符串长度; lstrlen()依据字符转载 2012-04-13 11:06:42 · 1875 阅读 · 0 评论 -
用C语言编写复杂的中断干扰处理器
当从外部的硬件或者处理器向CPU发出异常信号的时候,中断就会发生了。CPU通过传递执行流来响应中断服务程序,其中CPU响应的过程是这样的:首先对事件进行处理,处理之后再返回中断代码。ISR本质上是一个不设任何参数和不返回任何值得函数。但是,和一般的规则函数不一样,你几乎可以在任何情况下调用ISR函数,因此在调用的时候要特别小心,特别是登陆和退出ISR函数时,要严格按照特定的执行规则和执行顺序来原创 2012-04-13 17:41:02 · 1007 阅读 · 0 评论 -
函数指针及函数指针数组的妙用
笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都原创 2012-04-17 16:16:06 · 344 阅读 · 0 评论 -
操作符简介
1.注意"=" "==" "!="还能操作各种引用类型。而"+"除了可以操作包含Boolean类型以外的基本数据类型外,还可以操作string类型。 2.多数操作符都是从左到右运算的,但是赋值操作是从右到左。 3.整型操作符在计算表达式时,若一个操作元是long,那么结果也是long,否则不管操作元是byte还是short、char,运算结果都是int。 4.算术右移位操作符>>原创 2012-05-04 10:53:11 · 455 阅读 · 0 评论 -
select_sort(选择法排序)==C++源代码
//----数学中有乘法口诀。。那只是工具。我们都很熟悉。//----C++中有一些基本的程序。也只是工具。我们必须像熟悉乘法口诀一样去熟悉这些程序。//----很基础的一些东西,必须熟练。。。 #include using namespace std;int main(){ void select_sort(int array[],int n);转载 2012-04-12 16:05:54 · 1205 阅读 · 0 评论 -
内核函数系列
如果我们了解系统调用表有关知识,也已知道如何拦截系统调用表中的函数,那么下面,我们再来了解一下我们要钩取的函数:目标函数。这方面,如果我们不仅了解系统调用表中有哪些函数,还知道这些函数的工作机制就最好了。但实际上,ntdll.dll 中的导出函数有好几百个,别说一个一个的探究,就是把它们都列出来,看着看着头都大了。幸运的是,我们不必了解每个函数,只要了解其所在的系列就行了。为什么这么说?因为微软已原创 2012-04-12 11:46:55 · 1278 阅读 · 0 评论 -
C语言中extern关键字详解
内容清单:1. 用extern声明外部变量(1)在一个文件内声明的外部变量(2)在多个文件中声明外部变量(3)在多个文件中声明外部结构体变量2. 用extern声明外部函数3. 总结 1. 用extern声明外部变量定义:外部变量是指在函数或者文件外部定义的全局变量。外部变量定义必须在所有的函数之外,且只能定义一次。(1) 在一个文件内声明的外转载 2012-04-11 17:34:29 · 786 阅读 · 0 评论 -
MFC中GetDlgItemText与GetDlgItemInt函数 -
GetDlgItemText 函数 用于获取对话框中指定控件的标题或文本。 UINT GetDlgItemText(HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount);hDlg 窗口的句柄。 nIDDlgItem 指定控件的标识符(ID)。 lpString 指向用于接收获取结果的缓冲区的指针。转载 2012-04-12 17:17:37 · 20941 阅读 · 0 评论 -
toa ltoa ultoa三个函数的区别
itoa ltoa ultoa 这3个函数在头文件 中其原形:char *itoa(int value,char *string,int radix)cahr *ltoa(long value,char *string,int radix) char *ultoa(unsigned long value,char *string,int radix)va原创 2012-04-12 17:21:05 · 7455 阅读 · 0 评论 -
bubblesort(冒泡法排序)==C++源代码
//----数学中有乘法口诀。。那只是工具。我们都很熟悉。//----C++中有一些基本的程序。也只是工具。我们必须像熟悉乘法口诀一样去熟悉这些程序。//----很基础的一些东西,必须熟练。。。 //-======这些程序写的很粗糙。。。如果想用,请将其做进一步完善与修改。。。。#include using namespace std;int main(){转载 2012-04-12 16:05:14 · 765 阅读 · 0 评论 -
GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue、Adj...
GetCurrentProcessID 得到当前进程的ID OpenProcessToken 得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限AdjustTokenPrivileges 判断令牌权限 要对一个任意进程(包括系统安全进程和服务进程)进原创 2012-04-12 16:37:09 · 925 阅读 · 0 评论 -
#pragma 预处理指令详解
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para 其中par原创 2012-04-12 17:52:44 · 468 阅读 · 0 评论 -
cli/sti 用法
cli 禁止中断发生sti 允许中断发生在对 ss 和sp操作的时候, 如果有中断发生,中断的保存现场的操作是将相关寄存器值保存到ss:sp指向的地址.如果ss 或者sp没有完成赋值操作, 这时候ss:sp指向的地址则是不期望的地方. 如果将系统或者其他应用的数据覆盖,会导致系统/应用崩溃. 下面是两条规则: 1)在改变ss:sp之前,必须用cli指令屏蔽中断原创 2012-04-12 10:34:04 · 1186 阅读 · 0 评论 -
atoi,atol,strtod,strtol,strtoul实现类型转换
atof(将字符串转换成浮点型数)相关函数 atoi,atol,strtod,strtol,strtoul表头文件 #include 定义函数 double atof(const char *nptr);函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时原创 2012-04-12 15:19:25 · 537 阅读 · 0 评论 -
汇编指令sysenter 和sysexit这两条新汇编的解释
简单说来就是User模式向System模式的一种调用。做过Native API编程的话应该就知道,即使是看起来像内核的NTDLL.dll也只不过是Ring3级的,最终的系统调用是由ntoskrnl.exe程序向内核发送IO请求,然后内核与驱动程序返回执行结果。这个调用的中间步骤就是用SYSENTER和SYSEXIT来实现,以达到保护模式的作用。以下是转自优快云的一篇详细一点的文章。SY原创 2012-04-11 16:37:06 · 8652 阅读 · 0 评论 -
Inline Hook 之(监视任意函数)
前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《 Inline HOOK API原创 2012-04-19 16:10:09 · 2289 阅读 · 1 评论 -
PUSHAD
汇编语言传送指令之一,与它相关的指令还有PUSHA,POPA/POPAD.它们配合使用用于8个16位/32位通用寄存器与堆栈之间的数据传送. PUSHAD指令压入32位寄存器,使他们按照EDI,ESI,EBP,ESP,EBX,EDX,ECX,最后是EAX的顺序出现在堆栈中。 要注意,PUSHA/PUSHAD,POPA/POPAD从80286处理器开始使用.执行PUSHA/PUSHAD,POPA原创 2012-04-19 17:38:04 · 2001 阅读 · 0 评论 -
PROCESS_INFORMATION
在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。其结构定义如下。 typedef struct_PROCESS_INFORMATION{ HANDLE hProcess; HANDLE hThread;原创 2012-07-06 14:54:18 · 649 阅读 · 0 评论 -
PROCESSENTRY32结构 详细介绍
PROCESSENTRY32 PROCESSENTRY32 Structure Describes an entry from a list of the processes residing in the system address space when a snapshot was taken. 用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息) 用原创 2012-07-09 11:21:44 · 10017 阅读 · 3 评论 -
MAKEWORD
MAKEWORD 宏 平台:SDK 这个宏创建一个被指定变量连接而成的WORD变量。返回一个WORD变量。 (注:typedef unsigned short WORD;) WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序; BYTE bHigh //指定新变量的高字节序; ); 例如: WORD wVersionRequested; wVersion原创 2012-06-26 14:31:32 · 3746 阅读 · 1 评论 -
C++ 中stdafx.h中文意思,并且在C++中起到的作用是什么?
Standard Application Fram Extend没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。为避免这种浪费,App原创 2012-07-10 10:00:34 · 727 阅读 · 0 评论 -
通过匿名管道实现进程间通信
有这么一个需求:要通过一个程序来启动多个其他的程序,其他程序退出的时候必须通知启动他们的程序。通过需求可以看到里面需要实现进程间的通信,虽然想起来简单,但是做完之后发现有很多需要注意的地方,在这里详细的说明一下。 进程间通信采用的是匿名通道通信方式。 主程序实现:1 创建匿名管道 SECURITY_ATTRIBUTES sa; //安全性结构 //填充安全性原创 2012-07-09 15:17:18 · 3782 阅读 · 0 评论 -
(转)memset和ZeroMemory
1. memset就是将一个内存区全部设置成你指定的值。以字节为单位。 ZeroMemory相当于memset(buffer,0,length)中参数2设置成0。2. memset有个潜在的危险,它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了编译时也不容易查出来;相比起源于Berkerly网络编程代码早期的bezro不是ANSIC函数,但它的两个参数更容易记忆。原创 2012-06-29 10:32:34 · 445 阅读 · 0 评论 -
memmove
相关函数: bcopy(), memccpy(),memcpy(), strcpy(), strncpy()表头文件: #include 定义函数: void *memmove(void *dest, const void *src, size_t n);函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,原创 2012-07-17 16:34:04 · 1526 阅读 · 0 评论 -
linux下C语言socket网络编程简例
这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端;客户端在接受到数据后打印出来,然后关闭。程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料。程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的。移植时服务端可原创 2012-08-14 10:51:01 · 1195 阅读 · 0 评论 -
VC++ CopyFile函数用法
BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileName, // pointer to filename to copy to BOOL bFailIfExists // flag for operation if file exis原创 2012-07-06 16:12:40 · 568 阅读 · 0 评论 -
用 GetEnvironmentVariable 获取常用系统变量
以前曾用 GetWindowsDirectory、GetSystemDirectory、GetTempPath等函数获取系统常用文件夹;也用过 SHGetSpecialFolderLocation、SHGetPathFromIDList函数获取过更多常用路径;但这都不如用 GetEnvironmentVariable 获取系统变量来得快.GetEnvironme原创 2012-07-06 14:12:18 · 2648 阅读 · 0 评论 -
Lzma(7-zip) 使用:
在C目录中有算法文件,进入Util\LzmaLib目录,编译生成LIB库,导出了以下两函数,LzmaCompress 为压缩函数,LzmaUncompress 为解压缩函数。MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, unsi原创 2012-05-18 14:25:14 · 2049 阅读 · 1 评论 -
C++模板使用介绍
1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(x>y)?x:y ;}//函数2.float原创 2012-04-20 11:32:10 · 498 阅读 · 0 评论 -
提升进程权限-OpenProcessToken等函数的用法
GetCurrentProcessID 得到当前进程的ID OpenProcessToken 得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限 AdjustTokenPrivileges 判断令牌权限要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用原创 2012-05-04 11:02:56 · 931 阅读 · 0 评论 -
动态链接库的数据及动态链接库重定向
动态链接库的数据 DLL可以包含全局数据及局部数据 变量范围DLL变量的默认范围与应用程序所声明的变量作用域相同,DLL源文件中的全局变量对于使用DLL的每个进程是全部可见的。静态变量受限于声明所在块范畴。默认情况下,每个进程具有自己的DLL全局变量及静态变量实例。 你所使用的开发工具可能会允许你超越默认的全局及静态变量范围。更多信息参见开发工具相关文档。 动态内存分配原创 2012-05-04 15:18:15 · 2508 阅读 · 0 评论 -
使用.local 重定向DLL 加载路径
在调试DLL或COM程序的时候, DLL文件可能会被其他程序占用,而无法被替换。 在WinXP,Vista 上, 可以通过创建.local 文件夹来重定向DLL 的加载路径 步骤(假设你的EXE为MyApp.exe, 要调试的DLL为 MyModule.dll):1) 在 MyApp.exe 的目录下创建一个 MyApp.exe.local 2) 把你希望加载的 MyModul原创 2012-05-04 17:01:22 · 1403 阅读 · 1 评论 -
__declspec
__declspecwww.diybl.com 时间 : 2008-06-19 作者:佚名 编辑:本站 点击: 2072[ 评论 ]__cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就原创 2012-05-08 16:23:58 · 525 阅读 · 0 评论 -
ObReferenceObjectByHandle
调用方传递给驱动程序的句柄不会经过 I/O 管理器,因此 I/O 管理器不对这类句柄执行任何验证检查。决不要假设一个句柄有效;始终确保句柄拥有正确的对象类型、对于所需任务的合适的访问权、正确的访问模式,并且访问模式与请求的访问兼容。驱动程序应该谨慎使用句柄,特别是那些从用户模式应用程序接收到的句柄。第一,这种句柄特定于进程上下文,因此它们仅在打开句柄的进程中有效。当从不同的进程上下文或工作线程原创 2012-05-09 11:44:37 · 2693 阅读 · 0 评论 -
GetModuleHandle函数
当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄。 使用GetModuleHandle函数格式:HMODULE GetModuleHandle( LPCTSTR lpModuleName); 参数 lpModuleName: [in]用指针指向一个包含模块名以NULL字符结尾的串,模块是.dll或.exe文件。原创 2012-05-14 10:23:30 · 3294 阅读 · 0 评论