!!驱动级隐藏文件,注册表,进程!!
!!驱动级隐藏文件,注册表,进程!!
驱动程序暂不提供源码!
提供接口方便调用!!!!!
技术这个东西如同一个圆 ,刚开始的时候我们就如同站在圆心,一旦投入学习下去 ,圆就慢慢变大 ,圆的边缘以外也就会越来越大,接触的多了 知道的多了, 就会发现自己真的很无知!
/*
Config.ini
====================================================
[VirtualPrintconfig]
path=c:\windows\system32
number=100
*/
int main(int argc, char* argv[])
{
// printf(”Hello World!\n”);
char path[MAX_PATH]=”D:\\config.ini”;
char Buffer[500];
int num;
memset(Buffer,0,sizeof(Buffer));
//读取字符
GetPrivateProfileString(”VirtualPrintconfig”, //应用程序名也就是在ini文件中[ ]
“path”, //读取指定键
NULL,
Buffer, //保存
500, //Buffer大小
path); //ini所在路径
num=GetPrivateProfileInt(”VirtualPrintconfig”,”number”,NULL,path); //读取数字
printf(”%s\n”,Buffer);
printf(”%d\n”,num);
strcpy(Buffer,”c:\\windows\\system32″);
num=1000;
char strnum[10];
WritePrivateProfileString(”VirtualPrintconfig”,”path”,Buffer,path); //写入配置文件
//写入数值
sprintf(strnum,”%d”,num);
WritePrivateProfileString(”VirtualPrintconfig”,”number”,strnum,path);
return 0;
}
内存管理向来是C/C++程序设计的一块雷区,大家都不怎么愿意去碰她,但是有时不得不碰它。虽然利用C++中的smart pointer已经可以完全避免使用指针,但是对于对于指针的进一步了解,有助于我们编写出更有效率的代码,也有助于我们读懂以前编写的程序。要明确区分堆和栈的分配方式也是理解程序运行的难点。
五大内存分区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)
明确区分堆与栈
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。
好了,我们回到我们的主题:堆和栈究竟有什么区别? 主要的区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。
虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)
对了,还有一件事,如果有人把堆栈合起来说,那它的意思是栈,可不是堆.
我这里有一段程序,用来在一个对话框里显示出一次http request的原始信息,不过使用Inet API做的,希望能有帮助。
[code]
void CHTTPRequestDlg::OnButtonRequest()
{
updateData(TRUE);
HINTERNET hInternet = InternetOpen(”Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)”, INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, NULL);
HINTERNET hSession = InternetConnect(hInternet, m_strHost,
m_nPort, “username”, “password”,
INTERNET_SERVICE_HTTP, 0, 0);
char* szAccept[] = {”*/*”, NULL};
CString strVerb;
m_comboVerb.GetWindowText(strVerb);
HINTERNET hRequest = HttpOpenRequest(hSession, strVerb, m_strObject, NULL, NULL, (LPCSTR*)szAccept, 0, 0);
struct
{
char* Language;
char* Encoding;
char* ContentType;
}Headers = {”Accept-Language: zh-cn\r\n”,
“Accept-Encoding: gzip, deflate\r\n”,
“Content-Type: application/x-www-form-urlencoded\r\n”};
if(m_bLanguage)
HttpAddRequestHeaders(hRequest, Headers.Language, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
if(m_bEncoding)
HttpAddRequestHeaders(hRequest, Headers.Encoding, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
if(m_bContentType)
HttpAddRequestHeaders(hRequest, Headers.ContentType, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
LPCSTR lpAddHeader = NULL, lpContent = NULL;
if(m_strHeaders.GetLength())
{
if(m_strHeaders.Right(2) != “\r\n”)
m_strHeaders += “\r\n”;
lpAddHeader = (LPCSTR)m_strHeaders;
}
if(m_strContent.GetLength() && (strVerb == “POST” || strVerb == “PUT”))
lpContent = (LPCSTR)m_strContent;
HttpSendRequest(hRequest, lpAddHeader, -1, (LPVOID)lpContent, m_strContent.GetLength());
m_editContentGot.SetSel(0, -1);
m_editContentGot.ReplaceSel(”");
LPSTR lpszData; // buffer for the data
DWORD dwSize; // size of the data available
DWORD dwDownloaded; // size of the downloaded data
// Set the cursor to an hourglass.
SetCursor(LoadCursor(NULL,IDC_WAIT));
// This loop handles reading the data.
while(1)
{
// The call to InternetQueryDataAvailable determines the amount of
// data available to download.
if (!InternetQueryDataAvailable(hRequest,&dwSize,0,0))
{
SetCursor(LoadCursor(NULL,IDC_ARROW));
break;
}
else
{
// Allocates a buffer of the size returned by InternetQueryDataAvailable
lpszData = new char[dwSize+1];
// Reads the data from the HINTERNET handle.
if(!InternetReadFile(hRequest,(LPVOID)lpszData,dwSize,&dwDownloaded))
{
delete[] lpszData;
break;
}
else
{
// Adds a null terminator to the end of the data buffer
lpszData[dwDownloaded]=’\0′;
int nLen = m_editContentGot.GetWindowTextLength();
m_editContentGot.SetSel(nLen-1, nLen-1);
m_editContentGot.ReplaceSel(lpszData);
// delete the two buffers
delete[] lpszData;
// Check the size of the remaining data. If it is zero, break.
if (dwDownloaded == 0)
break;
}
}
}
// Close the HINTERNET handle
InternetCloseHandle(hRequest);
InternetCloseHandle(hSession);
InternetCloseHandle(hInternet);
// Set the cursor back to an arrow
SetCursor(LoadCursor(NULL,IDC_ARROW));
使用MFC示例如下:
首先设置m_strRequest请求字符串 eg.”name=aaa&pass=bbb”;
m_strServerName 服务器名称或者IP eg.”www.yahoo.com”
m_strObjectName 请求文件位置 eg. “pub/aaa.asp”
请求的结果存放在m_strHtml中
func(){
CInternetSession m_InetSession(”session”);
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try{
INTERNET_PORT nPort;
nPort=80;
pServer = m_InetSession.GetHttpConnection(m_strServerName, nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,
m_strObjectName);
char szHeaders[100];
strcpy(szHeaders,”Accept: text*/*\r\nContent-Type: application/x-www-form-urlencoded”);
pFile->AddRequestHeaders(szHeaders);
pFile->SendRequestEx(m_strRequest.GetLength());
pFile->WriteString(m_strRequest); //重要–>m_Request 中有”name=aaa&name2=BBB&…”
pFile->EndRequest();
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
CString str;
m_Mutex.Lock();
m_strHtml=”";
char szBuff[1024];
if (dwRet == HTTP_STATUS_OK){
UINT nRead;
while ((nRead = pFile->Read(szBuff,1023))>0)
{
m_strHtml+=CString(szBuff,nRead);
}
}
m_Mutex.Unlock();
delete pFile;
delete pServer;
}
catch (CInternetException* e){
CString s;
s.Format(”Internet Exception\r\nm_dwError%u,m_dwContextError%u”,e->m_dwError,e->m_dwContext);
AfxMessageBox(s);
//catch errors from WinInet
}
}
[/code]
->|侬| |尔| |质| |未| |天| |愿| |独| |花| |明| |一| |游| |花|
|今| |今| |本| |若| |尽| |奴| |依| |开| |媚| |年| |丝| |谢|
|葬| |死| |洁| |锦| |头| |胁| |花| |易| |鲜| |三| |软| |花|
|花| |去| |来| |囊| |,| |下| |锄| |见| |妍| |百| |絮| |飞|
|人| |侬| |还| |收| |何| |生| |偷| |落| |能| |六| |飘| |飞|
|笑| |收| |洁| |艳| |处| |双| |洒| |难| |几| |十| |春| |满|
|痴| |葬| |去| |骨| |有| |翼| |泪| |寻| |时| |日| |榭| |天|
|,| |,| |,| |,| |香| |,| |,| |,| |,| |,| |,| |,|
|他| |未| |强| |一| |丘| |随| |洒| |阶| |一| |风| |落| |红|
|年| |卜| |于| |抔| |?| |花| |上| |前| |朝| |刀| |絮| |消|
|葬| |侬| |污| |净| | | |飞| |空| |愁| |飘| |霜| |轻| |香|
|侬| |身| |淖| |土| | | |到| |枝| |杀| |泊| |剑| |沾| |断|
|知| |何| |陷| |掩| | | |天| |见| |葬| |难| |严| |扑| |有|
|是| |日| |渠| |风| | | |尽| |血| |花| |寻| |相| |绣| |谁|
|谁| |丧| |沟| |流| | | |头| |痕| |人| |觅| |逼| |帘| |怜|
|?| |?| |。| |,| | | |。| |。| |,| |。| |,| |。| |?|
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | |一| |试| |天|
| | | | | | | | | | | | | | | | | | |朝| |看| |尽|
| | | | | | | | | | | | | | | | | | |春| |春| |头|
| | | | | | | | | | | | | | | | | | |尽| |残| |,|
| | | | | | | | | | | | | | | | | | |红| |花| |何|
| | | | | | | | | | | | | | | | | | |颜| |渐| |处|
| | | | | | | | | | | | | | | | | | |老| |落| |有|
| | | | | | | | | | | | | | | | | | |,| |,| |香|
| | | | | | | | | | | | | | | | | | |花| |便| |丘|
| | | | | | | | | | | | | | | | | | |落| |是| |?|
| | | | | | | | | | | | | | | | | | |人| |红| | |
| | | | | | | | | | | | | | | | | | |亡| |颜| | |
| | | | | | | | | | | | | | | | | | |两| |老| | |
| | | | | | | | | | | | | | | | | | |不| |死| | |
| | | | | | | | | | | | | | | | | | |知| |时| | |
| | | | | | | | | | | | | | | | | | |。| |。| | |
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | |