delphi怎么创建常驻的delphi 共享内存 下载

随笔 - 110&
文章 - 28&评论 - 26&
随笔分类(103)
随笔档案(110)
文章分类(25)
文章档案(28)
新闻档案(3)
淋巴结肿大,淋巴结核,淋巴结炎
乳腺增生,小叶增生
颈椎病,腰椎病,腰间盘突出
马氏淋巴消炎贴,马氏增生散结贴,马氏关节肌肉贴
全球最大的黑客门户网站
积分与排名
阅读排行榜
评论排行榜
人多,问题多,帮人家解决问题就是提高自己&delphi群:本群已满:&&& 500人超群:& 汇编反汇编群:本人经济原因,开个淘宝了,请大家帮点击一下,加点流量,对您可能有帮助1个人网站,纯HTML
小叶子 阅读(186) |
映像函数:1.createfilemapping();创建映像HANDLE CreateFileMapping(HANDLE hFile,&&&&&&&&&&&&&&&&&&&&&& //物理文件句柄LPSECURITY_ATTRIBUTES lpAttributes, //安全设置DWORD flProtect,&&&&&&&&&&&&&&&&&&& //保护设置DWORD dwMaximumSizeHigh,&&&&&&&&&&& //高位文件大小DWORD dwMaximumSizeLow,&&&&&&&&&&&& //低位文件大小LPCTSTR lpName&&&&&&&&&&&&&&&&&&&&& //共享内存名称);
2.openfilemapping();打开映像HANDLE openfilemapping(访问类型,是否可继承,共享内存名称)
3.mapviewoffile();映射到本进程中mapviewoffile(句柄,访问类型,0,0,映射字节)
4.unmapviewoffile()关闭映像unmapviewoffile(mapviewoffile的句柄)
小叶子 阅读(442) |
一.内核对象和地址空间为了更好地理解本文后面的内容,在介绍内存映像文件之前我们先简单回顾一下Windows中内核对象和地址空间的有关概念。在Windows中有各种内核对象,如事件、文件、进程、旗语、互斥体等。内核对象是由系统内核分配管理的一段内存块,只有系统内核能够直接访问这一段内核对象数据,而应用程序只能通过Windows提供的一系列函数按规定的方式去操作这些内核对象。我们通过调用有关Windows API函数创建内核对象(这些函数通常带有Create前缀)。当我们调用一个函数创建内核对象的时候,该函数通常返回一个标识该对象的句柄(HANDLE)。我们把标识该内核对象的句柄传递给有关windows函数,告诉系统去操作哪一个内核对象。内核对象属于系统内核而不是进程,内核对象可被多个进程访问使用,也即可在多个进程间共享。每个内核对象自身有一个引用计数值,它记录有多少进程使用该对象,当引用计数值为零时由系统负责销毁内核对象。在多个进程间共享内核对象有三种方法:句柄继承、命名、句柄复制。在本文后面将要提到的文件映像对象亦是内核对象。在Windows中每一个进程都有自己私有的地址空间,对32位的进程来说地址空间的大小是从0x 到 0xFFFFFFFF共4GB范围。这个空间仅仅是内存地址的范围,而不是计算机的物理存储RAM空间,因而又称为虚拟内存空间。使用某段虚拟内存空间需要经过保留和提交两个过程,将物理存储分配映像到地址空间的该段区域上。物理存储不应理解为RAM,实际上应理解为来自于磁盘上(通常为硬盘)的系统内存分页文件,在必要时(读写访问时)其内容才会被系统写到RAM中或从RAM中写回来。磁盘上的这种系统内存分页文件又称为虚拟内存。二. 内存映像文件几乎每个应用程序都要和文件打交道。比如,应用程序有时需要打开、读取、再关闭文件;而有时需要打开文件,将数据读到一个缓冲区再写回到文件中另一个位置。通常实现起来都显得有点繁琐。Microsoft Windows提供了满足这两方面要求的最佳解决途径:内存映像文件。象使用虚拟内存一样,使用内存映像文件同样需要经过保留和提交两个过程,首先在进程内存空间保留一块区域,然后提交物理存储给这段区域。不同的是物理存储来自于磁盘上的文件,而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存,这个实现过程被称为文件映像,可以将文件全部或部分映像到进程的地址空间中。文件映像过以后,可以把文件映像的部分当作已全部被载入内存一样的去访问它,这时又称它为内存映像文件。内存映像文件通常有三个方面的应用:1. 系统使用内存映像文件载入和执行.EXE和.DLL文件。一方面节省了系统分页文件空间,另一方面缩短了加载应用程序开始执行所需的时间。2. 使用内存映像文件访问磁盘上的数据文件。绕开对文件实行I/O操作和对文件内容的缓冲,交由操作系统内核去完成。3. 使用内存映像文件可以实现在多个进程间彼此共享数据。Windows提供了在进程间进行数据通信的其它多种方法。但这些方法也是通过内存映像文件来实现的,所以内存映像文件是实现进程间通信最有效率的方法。三. 内存映像文件使用步骤要使用内存映像文件,可以按以下步骤:(1) 调用Windows API 函数CreateFile()创建或是打开一个文件,得到一个标识该文件(内核对象)的句柄,它确定了哪一个磁盘文件将要作为内存映像文件。(2) 将(1)中得到的文件对象句柄作为第一个参数调用Windows API 函数CreateFileMapping()创建一个文件映像对象。通知系统该文件的大小及对该文件的访问方式,同时也得到一个标识该文件映像对象的句柄。(3) 将(2)中得到的文件映像对象句柄作为第一个参数调用Windows API 函数MapViewOfFile()通知系统映像文件全部或部分内容到进程的某一段地址空间,并将此段空间首地址通过该函数返回。这一步也就是使用虚拟内存的保留和提交过程,此后就可以利用此首地址实现对文件内容的读写了。也可以不做第一步,直接从第二步开始,但这时要用INVALID_HANDLE_VALUE为参数作为标识文件对象的句柄,这时系统以其分页文件作为内存映像文件而不用指定磁盘上的哪一个磁盘文件。当你使用完内存映像文件后,需要做以下几步清除动作。(1) 调用Windows API 函数UnmapViewOfFile(),通知系统释放文件映像对象在进程地址空间中占用的区域。(2) 调用Windows API 函数CloseHandle(),分别关闭文件映像对象和文件对象。四. 内存映像文件应用举例1.应用一 —— 系统加载.EXE和.DLL当一个.EXE文件被载入准备运行时,系统要执行以下几步:(1) 系统定位.EXE文件在磁盘的位置。(2) 系统创建一个新的内核对象——进程。(3) 系统为此进程创建其私有地址空间。(4) 系统保留地址空间中足够大的一块区域容纳.EXE文件。而这块区域的基地址在.EXE文件中有所指定,通常在0x处。(5) 系统记下支持这块区域的物理存储是.EXE文件,而不是在系统内存分页文件。这之后系统访问.EXE文件有关信息项,确定所要载入哪些.DLL(动态连接库)文件。系统调用LoadLibrary函数载入.DLL文件,执行类似上述(4)、(5)步的操作。(1) 系统保留地址空间中足够大的一块区域容纳.DLL文件。同样其基地址在.DLL件中有所指定。 Visual C++下制作DLL,默认情况下是 0x处。(2) 如果从该基地址开始的区域已被另一个.DLL或.EXE所占,或从该基地址开始的区域不够大,系统将在地址空间寻找另一块区域,保留给.DLL文件。(3) 系统记下支持这块区域的物理存储是在.DLL文件,而不是在系统内存分页文件。在所有的.EXE和.DLL文件被映像到进程的地址空间中后,系统开始执行.EXE文件的入口点代码。2.应用二 —— 进程间共享数据Windows的确提供了很多快速、方便的机制用于应用程序间共享数据和信息。这些机制包括RPC、COM、OLE、DDE、WINDOWS消息(特别是WM_COPYDATA),剪贴板,管道,套节字等等。然而在Windows中,同一台机器上多进程间共享数据最底层的机制是内存映像文件。也就是说在同一台机器上,采用上述提到的方法实现进程间通信,最终全都是通过内存映像文件分别实现各自特定的任务。因此使用内存映像文件是提高这类程序性能的一种极好途径。多进程间共享数据是通过将同一个文件映像对象的同一块区域映像到各进程地址空间中来实现的。映像到在各个进程中的地址空间区域可能有所不同,但是各进程的这段区域共享相同的物理存储分页文件,如图1所示。因此,当其中一个进程向文件映像对象的这一区域写入数据时,其他进程在它们自身的地址空间中就能看到这一区域的变化。让我们接着看系统加载.EXE启动一个应用程序这个例子。当启动一个程序时,系统调用CreateFile函数打开磁盘上的.EXE文件。然后系统调用CreateFileMapping函数创建一个文件映像对象,最后调用MapViewOfFileEx (用SEC_IMAGE 标志)将.EXE文件映像到进程的地址空间中。此处用MapViewOfFileEx代替MapViewOfFile使文件映像到进程地址空间中的首地址是存储在.EXE文件中指定的位置。然后系统创建进程的主线程,把此映像区域可执行代码区的第一个字节的地址赋给线程的执行指针,然后让CPU开始执行代码。如果用户执行同一个程序第二个实例时,系统会发现所要创建.EXE文件的文件映像对象在内核中已经存在,因而不会再创建新的文件对象或文件映像对象。取而代之的是,系统再次映像文件,这次是在新创建进程的地址空间中。可见系统同时映像同一个文件到两个地址空间中。显然这更有效使用了内存,因为两个进程共享同一个包含正在执行代码部分的物理存储文件。象所有共享内核对象方法一样,可以使用句柄继承、命名、句柄复制三种方法在多个进程间共享文件映像对象。下面列出了用命名方法共享内核对象,实现在两个进程间共享数据的部分具体代码。用命名方法实现多个进程共享同一个文件映像对象时,所有进程只需要对共享的文件映像对象使用完全相同的名称。进程1://创建一个物理存储来自系统分页文件的文件映像对象,//其大小为4 KB 命名为MMFSharedData.&& s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,&&&&&&&&&&&& PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));//将该对象内容全部映像到进程地址空间中&&& PVOID pView = MapViewOfFile(s_hFileMap,&&&&&&&&&&&&&&&&&& FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);进程2:// 打开名称为MMFSharedData 的文件映像对象HANDLE hFileMapT = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,&&&&&&&&&&&& FALSE, TEXT("MMFSharedData"));//将该对象内容全部映像到进程地址空间中PVOID pView = MapViewOfFile(hFileMapT,&&&&&&&&&&&&&&& FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);这两个进程在其各自pView指针开始处4KB内容的物理存储来自同一个分页文件的同一段区域,因而具有相同的内容,也即它们共享同一段数据。
小叶子 阅读(2284) |
在Delphi中涉及到系统编程的方面毫无例外都要调用API函数,在ShellAPI.pas单元中有要用到的API函数的原型。实战演练:一.新建一个应用程序: File-&New Applicaton,在uses后部分定义一个消息常量:WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。再定义过程procedure WMNID(var msg:TMessage);message WM_NID;二.定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看: type_NOTIFYICONDATAA = record&&&& cbSize: DWORD;&&&& Wnd: HWND;&&&& uID: UINT;&&&& uFlags: UINT;&&&& uCallbackMessage: UINT;&&&& hIcon: HICON;&&&& szTip: array [0..63] of AnsiC这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。1& cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。2& Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。3& uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。3& uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:&&&& NIF_ICON&&&& 表示当前所设置的图标(即hIcon的值)是有效的 &&&& NIF_MESSAGE 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的&&&& NIF_TIP&&&&& 表示当前所设置的提示条(即szTip的值)是有效的。4& uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个你在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。 6& hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除。7& szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。三. 双击主窗体,进入FormCreate的代码区域:&& TForm1.FormCreate(Sender:TObject);&& Begin&&&&& //NotifyIcon为全局变量,在程序的开头已经定义了&&&&& with NotifyIcon do&&&&& begin&&&&&&& cbSize:=SizeOf(TNotifyIconData);&&&&&&& Wnd:=H&& //指向当前窗体Form1的句柄&&&&&&& uID:=1;&&&&&&& uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;&&&&&&& uCallBackMessage:=WM_NID;&&&&&&& hIcon:=Application.Icon.H&&&&&&& szTip:=”张家恶少”;&&&&&.&&&& //把设置好的变量NotifyIcon加入到系统中以便处理&&& Shell_NotifyIcon(NIM_ADD,@NotifyIcon);&& E四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。procedure tform1.WMNID(var msg:TMessage);message WM_NID;begin&& case msg.LParam of&&&&& WM_LBUTTONUp; Form1.Visible:=not Form1.V&&&&& WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);&& EE好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.Project-&Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。TForm1.FormDestroy(Sender:TObject);BeginShell_NotifyIcon(NIM_DELETE,@NotifyIcon);E
毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。
//托盘图标是否显示procedure HideSysTray(visible:boolean); var Tray, Child : hW C : array[0..127] S : begin Tray := FindWindow('Shell_TrayWnd', NIL); Child := GetWindow(Tray, GW_CHILD); While Child && 0 do begin If GetClassName(Child, C, SizeOf(C)) & 0 Then Begin S := StrPAS(C); If UpperCase(S) = 'TRAYNOTIFYWND' then begin If visible then ShowWindow(Child, 1) else ShowWindow(Child, 0);
Child := GetWindow(Child, GW_HWNDNEXT);
当自定义过程 HideSysTray() 的参数为 False 时,托盘区隐藏,参数为 True 时,托盘区显示。
小叶子 阅读(306) |
完美双开,只要你机子能上一个号就能开起第二个,不是沙盘,也不是虚拟机QQ:
小叶子 阅读(396) |
CALC判断表达式WATCH添加监视表达式AT在指定地址进行反汇编FOLLOW跟随命令orIG反汇编于 EIPDUMP在指定地址进行转存DA转存为反汇编代码DB使用十六进制字节格式转存DC使用 ASCII 格式转存DD转存在堆栈格式DU转存在 UNICODE 格式DW使用十六进制字词格式转存STK前往堆栈中的地址AS(AS + 地址 + 字符串)在指定地址进行汇编BP进行条件中断(有条件的断点)BPX中断在全部调用 (Call)BPD清除全部调用中的断点BC清除断点MR内存断点于访问时MW内存断点于写入时MD清除内存断点HR访问时进行硬件中断HW写入时进行硬件中断HE执行时进行硬件中断HD清除硬件断点STOP停止运行程序调试PAUSE暂停执行程序调试RUN运行程序进行调试GE运行和通过例外SI单步进入 Call 中SO步过 CallTI跟踪进入直到地址TO跟踪步过直到地址TC跟踪进入直到满足条件TOC跟踪步过直到满足条件TR运行直到返回TU运行直到用户代码LOG查看记录窗口MOD查看模块窗口MEM查看内存窗口CPU查看 CPU 窗口CS查看 Call 堆栈BRK查看断点窗口OPT打开选项设置窗口EXIT退出 OllyDbgQUIT退出 OllyDbgOPEN打开一个可执行文件CLOSE关闭可执行文件RST重新运行当前程序HELP查看 API 函数的帮助
小叶子 阅读(1001) |
很难找到的一本书,大家快点下 晚了就不能下载了
小叶子 阅读(509) |
入口特征............Microsoft Visual C++ 6.000496EB8 &/$ 55 PUSH EBP ; (初始 cpu 选择)00496EB9 |. 8BEC MOV EBP,ESP00496EBB |. 6A FF PUSH -100496EBD |. 68
PUSH Dumped.00496EC2 |. 68 8CC74900 PUSH Dumped.0049C78C ; SE 处理程序安装00496EC7 |. 64:A1 0000000&MOV EAX,DWORD PTR FS:[0]00496ECD |. 50 PUSH EAX00496ECE |. 64:&MOV DWORD PTR FS:[0],ESP00496ED5 |. 83EC 58 SUB ESP,58Microsoft Visual Basic 5.0 / 6.0 - FF25 6C104000 JMP DWORD PTR DS:[&&MSVBVM60.#100&] ; MSVBVM60.ThunRTMain0040116C & 68 147C4000 PUSH Dumped.00407C14 F0FFFFFF CALL &JMP.&MSVBVM60.#100&0 ADD BYTE PTR DS:[EAX],AL0 ADD BYTE PTR DS:[EAX],AL00 ADD BYTE PTR DS:[EAX],AL00 XOR BYTE PTR DS:[EAX],ALVB还有一种00401FBC & 68 D0D44000 push Dumped.0 EEFFFFFF call &jmp.&msvbvm60.ThunRTMain&00 add byte ptr ds:[eax],al00 add byte ptr ds:[eax],al00401FCA 0000 add byte ptr ds:[eax],al00401FCC 3000 xor byte ptr ds:[eax],al00401FCE 0000 add byte ptr ds:[eax],alBorland C++0040163C & $ /EB 10 JMP SHORT BCLOCK.0040164E0040163E |66 DB 66 ; CHAR 'f'0040163F |62 DB 62 ; CHAR 'b'A DB 3A ; CHAR ':' DB 43 ; CHAR 'C'B DB 2B ; CHAR '+'B DB 2B ; CHAR '+' DB 48 ; CHAR 'H'F DB 4F ; CHAR 'O'F DB 4F ; CHAR 'O'B DB 4B ; CHAR 'K' NOP |E9 DB E90040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook0040164E & \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B] . C1E0 02 SHL EAX,2 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX0040165B . 52 PUSH EDX0040165C . 6A 00 PUSH 0 ; /pModule = NULL0040165E . E8 DFBC0E00 CALL &JMP.&KERNEL32.GetModuleHandleA& ; \GetModuleHandleA . 8BD0 MOV EDX,EAXBorland Delphi 6.0 - 7.000509CB0 & $ 55 PUSH EBP00509CB1 . 8BEC MOV EBP,ESP00509CB3 . 83C4 EC ADD ESP,-1400509CB6 . 53 PUSH EBX00509CB7 . 56 PUSH ESI00509CB8 . 57 PUSH EDI00509CB9 . 33C0 XOR EAX,EAX00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX00509CBE . B8
MOV EAX,Dumped.00509CC3 . E8 84CCEFFF CALL Dumped.0040694C易语言入口 & E8
call Dumped.0040100B push eax BB010000 call &jmp.&KERNEL32.ExitProcess& push ebpBEC mov ebp,espC4 F0FEFFFF add esp,-110
jmp Dumped.0040109CB72 6E 6C imul esi,dword ptr ds:[edx+6E],6CE outs dx,byte ptr es:[edi]也是有令一种形式Microsoft Visual C++ 6.0 [Overlay]的E语言 &/$ 55 PUSH EBP |. 8BEC MOV EBP,ESP |. 6A FF PUSH -1 |. 68 F0624000 PUSH Dumped.0040383B |. 68 A44C4000 PUSH Dumped.00404CA4 ; SE 处理程序安装 |. 64:A1 0000000&MOV EAX,DWORD PTR FS:[0] |. 50 PUSH EAX |. 64:&MOV DWORD PTR FS:[0],ESPMASM32 / TASM32 &/$ 6A 00 push 0 ; /pModule = NULL0040125A |. E8
call &jmp.&kernel32.GetModuleHandleA& ; \GetModuleHandleA0040125F |. A3
mov dword ptr ds:[403000],eax |. 6A 00 push 0 ; /lParam = NULL |. 68 DF104000 push Dumped.004010DF ; |DlgProc = dump.004010DF0040126B |. 6A 00 push 0 ; |hOwner = NULL0040126D |. 6A 65 push 65 ; |pTemplate = 650040126F |. FF35
push dword ptr ds:[403000] ; |hInst = NULL |. E8
call &jmp.&user32.DialogBoxParamA& ; \DialogBoxParamAVC8004A2ADC & $ E8 B6A40000 call Dumped.004ACF97004A2AE1 .^ E9 16FEFFFF jmp Dumped.004A28FC004A2AE6 CC int3004A2AE7 CC int3004A2AE8 CC int3004A2AE9 CC int3004A2AEA CC int3004A2AEB CC int3004A2AEC CC int3004A2AED CC int3004A2AEE CC int3004A2AEF CC int3004A2AF0 /$ 8B4C24 04 mov ecx,dword ptr ss:[esp+4]004A2AF4 |. F7C1
test ecx,3004A2AFA |. 74 24 je short Dumped.004A2B20004A2AFC |& 8A01 /mov al,byte ptr ds:[ecx]004A2AFE |. 83C1 01 |add ecx,1
小叶子 阅读(1409) |
一. INT3断点& 一般用F2设置& 可以设置无数个,但改变程序指令(68-&CC)& 很多程序都用检测函数前两个字节来检测自己是否被下断.解决办法是在函数前或后设置二.硬件断点&他与DRx调试器有关,CPU共8个调试寄存器,从DR0-DR7&硬件断点就是利用DR0-DR3.这四个下断& 右键-&断点-&硬件执行三.内存断点&INT3不能用.硬件断点失灵里可用这个代替,程序没有跑起来时用四.内存访问一次性内存断点&ALT+M-&F2五.消息断点&所有的消息都有四个参数:&& 窗口句柄& 消息编号& 两个32位数六.条件断点&1&& 寄存器条件& eax==0400000&&&&& &command里输入:bp 401776 eax==400000&2&& 按存储器条件
小叶子 阅读(1873) |
在实模式下,CPU寻址方式:CS:偏移量而保护模式下段寄存器放的是段选择子(既一个指针,段选择子长16位,其格式如下表所示。从表中可见,段选择子的高13位是描述符索引(Index)。所谓描述符索引是指描述符在描述符表中的序号。段选择子的第2位是引用描述符表指示位,标记为TI(Table & Indicator),TI=0指示从全局描述符表GDT中读取描述符;TI=1指示从局部描述符表LDT中读取描述符)&&& & 选择子 +& 偏移量指向了内存现在说虚拟内存是怎么实现的?1.应用程序被启动,系统创建一个进程,并分给它2GB虚拟地址(不是内存,地址而已)2.虚拟内存管理器把程序代码映射到上面分配的2GB虚拟地址中,这里全部分配,程序运行时用到的代码再映射到物理内存中3.如果程序用到dll,也被映射到另个2GB虚拟地址,真正用到时映射到物理内存(和1中的2GB共4GB)..........上面是主要的。我比做一个例子也许好明白点:一张桌子比做内存,周围的小朋友要在上面玩积木(一个人是一个程序)。小张要先玩,从老师(硬盘)那里要来积木,放在口袋里,口袋就是2GB虚拟地址,全部在口袋里,如果他要用哪一块积木就放在桌子上,这就是映射到内存,用一点映射一点小李也要玩,同小张一样......虚拟地址(每个人的口袋)解决了内存(桌子)不够用的问题。如果没有这个口袋,两个人玩时就可能把桌子全占了
小叶子 阅读(554) |
getwindowtext()getdlgitem()getdlgitemtext()windows消息机制用到的APIsendmessage()WM_command&&&&&& &0111H&(对应16进制数)WM_destory&&&&&&&&&&&&&&&02HWM_gettext&&&&&&&&&&& && &0DHWM_quit&&&&&&&&&&&&&&&& & 012HWM_lbuttondown&& &0201H
小叶子 阅读(375) |
笔记和文章,可能抄袭,只为学习,请原谅进程间共享内存及消息传递组件Delphi源码 免费下载 - 维维软件园CSDN社区&Delphi&Wind;求delphi进程间通讯例子,自定义消息传递或共;楼主skphoebe(小鲨鱼);谢谢,摆脱那位大哥供小弟学习下!问题点数:50、;1楼abc3000(想想就烦)回复于2005-0;以下例子是共享内存实现进程间通讯,没有大的问题,;Top;2楼abc3000(想想就烦)回复于2005-0;u
CSDN社区 &
Windows SDK/API
求 delphi进程间通讯例子,自定义消息传递或共享内存区!
楼主skphoebe(小鲨鱼) 14:00:08 在 Delphi / Windows SDK/API 提问
谢谢,摆脱那位大哥供小弟学习下! 问题点数:50、回复次数:13Top
1 楼abc3000(想想就烦)回复于
14:26:34 得分 0
以下例子是共享内存
实现进程间通讯,没有大的问题,就是最后个字符会被吃掉
2 楼abc3000(想想就烦)回复于
14:27:18 得分 0
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,StdCtrls,D
TFileMap=class(TComponent)
FMapHandle:TH
//内存映射文件句柄
FMutexHandle:TH
//互斥句柄
//内存映射对象
FSynchMessage:
//同步消息
FMapStrings:TStringL
//存储映射文件信息
//映射文件大小
FMessageID:DW
//注册的消息号
FMapPointer:PC
//映射文件的数据区指针
FIsMapOpen:B
//文件是否打开
FExistsAlready:B
//是否已经建立过映射文件
FReading:B
//是否正在读取内存文件数据
FAutoSynch:B
//是否同步
FOnChange:TNotifyE
//当内存数据区内容改变时
FFormHandle:H
//存储本窗口的窗口句柄
FPNewWndHandler:P
FPOldWndHandler:P
SetMapName(Value:string);
SetMapStrings(Value:TStringList);
SetSize(Value:DWord);
SetAutoSynch(Value:Boolean);
EnterCriticalS
LeaveCriticalS
MapStringsChange(Sender:TObject);
NewWndProc(var
FMessage:TMessage);
constructor
Create(AOwner:TComponent);
destructor
ExistsAlready:Boolean
IsMapOpen:Boolean
MaxSize:DWord
AutoSynchronize:Boolean
FAutoSynch
MapName:string
MapStrings:TStringList
FMapStrings
OnChange:TNotifyEvent
implementation
//构造函数
constructor
TFileMap.Create(AOwner:TComponent);
Create(AOwner);
FAutoSynch:=T
FSize:=4096;
FReading:=F
FMapStrings:=TStringList.C
FMapStrings.OnChange:=MapStringsC
FMapName:='Unique
name';
FSynchMessage:=FMapName+'Synch-Now';
FFormHandle:=(AOwner
//得到窗口处理过程的地址
FPOldWndHandler:=Ptr(GetWindowLong(FFormHandle,GWL_wNDPROC));
FPNewWndHandler:=MakeObjectInstance(NewWndProc);
FPNewWndHandler=nil
Exception.Create('超出资源');
//设置窗口处理过程的新地址
SetWindowLong(FFormHandle,GWL_WNDPROC,Longint(FPNewWndHandler));
Exception.Create('组件的所有者应该是TForm');
//析构函数
destructor
TFileMap.D
//还原Windows处理过程地址
SetWindowLong(FFormHandle,GWL_WNDPROC,Longint(FPOldWndHandler));
FPNewWndHandler&&nil
FreeObjectInstance(FPNewWndHandler);
//释放对象
FMapStrings.F
FMapStrings:=
3 楼abc3000(想想就烦)回复于
14:27:33 得分 30
//打开文件映射,并映射到进程空间
TFileMap.OpenM
TempMessage:array[0..255]
(FMapHandle=0)
(FMapPointer=nil)
FExistsAlready:=F
//创建文件映射对象
FMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,FSize,PChar(FMapName));
(FMapHandle=INVALID_HANDLE_VALUE)
(FMapHandle=0)
Exception.Create('创建文件映射对象失败!')
//判断是否已经建立文件映射了
(FMapHandle&&0)
(GetLastError=ERROR_ALREADY_EXISTS)
FExistsAlready:=T
//如果已经建立的话,就设它为TRUE;
//映射文件的使徒到进程的地址空间
FMapPointer:=MapViewOfFile(FMapHandle,FILE_MAP_ALL_ACCESS,0,0,0);
FMapPointer=nil
Exception.Create('映射文件的视图到进程的地址空间失败')
StrPCopy(TempMessage,FSynchMessage);
//在WINDOWS中注册消息常量
FMessageID:=RegisterWindowMessage(TempMessage);
FMessageID=0
Exception.Create('注册消息失败')
//创建互斥对象,在写文件映射空间时用到它,以保持数据同步
FMutexHandle:=Windows.CreateMutex(nil,False,PChar(FMapName+'.Mtx'));
FMutexHandle=0
Exception.Create('创建互斥对象失败');
FIsMapOpen:=T
FExistsAlready
//判断内存文件映射是否已打开
//解除文件视图和内存映射空间的关系,并关闭文件映射
TFileMap.CloseM
FIsMapOpen
//释放互斥对象
FMutexHandle&&0
CloseHandle(FMutexHandle);
FMutexHandle:=0;
//关闭内存对象
FMapPointer&&nil
//解除文件视图和内存映射空间的关系
UnMapViewOfFile(FMapPointer);
FMapPointer:=
FMapHandle&&0
//并关闭文件映射
CloseHandle(FMapHandle);
FMapHandle:=0;
FIsMapOpen:=F
//读取内存文件映射内容
TFileMap.ReadM
FReading:=T
if(FMapPointer&&nil)
FMapStrings.SetText(FMapPointer);
//向内存映射文件里写
TFileMap.WriteM
StringsPointer:PC
HandleCounter:
SendToHandle:HW
FMapPointer&&nil
StringsPointer:=FMapStrings.GetT
//进入互斥状态,防止其他线程进入同步区域代码
EnterCriticalS
StrLen(StringsPointer)+1&=FSize
System.Move(StringsPointer^,FMapPointer^,StrLen(StringsPointer)+1)
Exception.Create('写字符串失败,字符串太大!');
//离开互斥状态
LeaveCriticalS
//广播消息,表示内存映射文件内容已经修改
SendMessage(HWND_BROADCAST,FMessageID,FFormHandle,0);
//释放StringsPointer
StrDispose(StringsPointer);
//当MapStrings值改变时
TFileMap.MapStringsChange(Sender:TObject);
Assigned(FOnChange)
FOnChange(Self)
FIsMapOpen
FAutoSynch
//设置MapName属性值
TFileMap.SetMapName(Value:string);
(FMapName&&Value)
(FMapHandle=0)
(Length(Value)&246)
FMapName:=V
FSynchMessage:=FMapName+'Synch-Now';
包含各类专业文献、生活休闲娱乐、幼儿教育、小学教育、中学教育、文学作品欣赏、高等教育、应用写作文书、90delphi进程间通讯例子,自定义消息传递或共享内存区等内容。 
 相等的共享内存,则新建一个消息 队列;如果存在这样的共享内存则报错; 函数返回...父子进程间通讯实例: #include #include #include #include #include #include ...  进程通常被定义为一个正在运行的程序的实例,它由两...函数和消息,为 Windows 应用程序之间进行数据共享提供...交换(DDE)通过维护全局分配内存使的应用程序间传递....  用于进程间通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix 和 ...共享内存区(匿名共享内存区,有名 Posix 共享内存区,有名 System V 共享内存 ...  用于进程间通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix 和 ...共享内存区(匿名共享内存区,有名 Posix 共享内存区,有名 System V 共享内存区...  就是在 2 个(多数情况下)或多个进程间传递信息。...最常见的例子:ls Cl |more 由于管道操作由 shell...共享内存的内容由进程自己定义。为了防 止多个进程...  内核缓冲区, 内核提供的这种机制称为进程间通信(IPC...现在把进程之间传递信息的各种途径(包括各种 IPC ...信号量和共享内存,现在已经基本废弃 UNIX Domain ...  的消息,还是以前写入的, 尚未被读取的消息) ; 信号量:不能传递复杂信息,只能用来同步; 共享内存:容量大小可控,速度快,但共享内存区不包含同步保护,对共享内存区...}

我要回帖

更多关于 创建共享内存失败 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信