win32调试

合集下载

pdf文件不是有效的win32应用程序

pdf文件不是有效的win32应用程序

pdf文件不是有效的win32应用程序双击盘符就会出现这个但是从阅读软件里打开文件就可以打开这是你下载的软件和内存有冲突,我给你4种方法调试,快试试吧:1.电脑里有木马或病毒干扰,下“360顽固木马查杀”,建议“全盘查杀”!2.你下载的播放器,或聊天软件,或IE浏览器的程序不稳定!(建议卸掉,下载新的)。

3.或者就是你安装了两款或两款以上的同类软件(如:多款播放器,多款qq,或浏览器等等)!它们在一起不兼容,卸掉多余的一款!4.你在电脑左下角“开始”菜单里找到“强力卸载电脑上的软件”,找到多余的那款卸掉!卸完了再“强力清扫”(看准了再卸,别把有用的卸了)。

这是感染病毒导致的,解决方案如下。

其一、确认病毒:(你当脱了马甲就认不出你了吗?小样!)首先用右键方式进入硬盘中,显示所有隐藏文件(包括受保护的操作系统文件),如果各分区下带autorun.inf一类的隐藏文件,全部删除之。

如操作不行:依次执行,开始--运行---输入“cmd”,进入“命令提示符”下,键入输入"X:"(X为盘符可以是D盘,可以是E盘。

)--输入"dir /a/w"如果可以看到autorun.inf 和sxs.exe 那确定你的系统已经中此病毒。

运行attrib -s -h -r(-s:去掉系统属性-h:去掉隐藏属性-r:去掉只读属性),del autorun.inf(删除此文件)。

其二、注册表处理:(剿灭你的“温柔”,灭了你!)具体步骤如下:1.点击windows桌面左下角的开始,选择:运行2.在对话框中输入“regedit”3.在注册表编辑器中展开hkey_current_user\software\microsoft\windows\currentversion\explorer\mountpoints24.将子目录下所有带加号“+”的项依次展开,如有一项叫做“command”的,这就个就是关键了!将之前的“autorun”、“auto”的目录整个删除。

汇编教程Win32调试API(1)

汇编教程Win32调试API(1)

在本教程中,我们将学习Win32提供给开发者的用于调试的原语. 在教程的结尾,我们将学习如何调试一个进程.理论:Win32有一些供程序员使用的API,它们提供相当于调试器的功能. 他们被称作Win32调试API(或原语).利用这些API,我们可以:加载一个程序或捆绑到一个正在运行的程序上以供调试获得被调试的程序的低层信息,例如进程ID,进入地址,映像基址等.当发生与调试有关的事件时被通知,例如进程/线程的开始/结束, DLL的加载/释放等.修改被调试的进程或线程简而言之,我们可以用这些API写一个简单的调试器.由于这个题目有些过大,我把它分为几部分,而本教程就是它的第一部分.在本教程中,我将讲解一些基本概念及Win32调试AP I的大致框架.使用Win32调试API的步骤如下:创建一个进程或捆绑到一个运行中的进程上. 这是使用Win32调试API的第一步.由于我们的程序要扮演调试器的角色,我们要找一个供调试的程序.一个被调试的程序被称为de buggee.可以通过以下两种方式获得debuggee:通过CreateProcess创建debuggee进程.为了创建被调试的进程,必须指定DEBUG_PROC ESS标志.这一标志告诉Windows我们要调试该进程. 当debuggee中发生重要的与调试有关的事件(调试事件)时,Windows 会向我们的程序发送通知.debuggee会立即挂起以等待我们的程序准备好.如果debuggee还创建了子进程,Windows还会为每个子进程中的调试事件向我们的程序发送通知.这一特性通常是不必要的.我们可以通过指定DEBUG_ONLY_THIS_PROC ESS与 DEBUG_PROCESS的组合标志来禁止它.我们也可以用 DebugActiveProcess标志捆绑到一个运行中的进程上.等待调试事件. 在获得了一个debuggee进程后,debuggee的主线程被挂起,这种状况将持续到我们的程序调用WaitForDebugEvent为止.这个函数和其他的WaitForXXX函数相似,比如说,它阻塞调用线程直到等待的事件发生.对这个函数来说, 它等待由Windows发送的调试事件.下面是它的定义:WaitForDebugEvent proto lpDebugEvent:DWORD, dwMilliseconds:DWORDlpDebugEvent is the address of a DEBUG_EVENT这个结构将被填入关于debuggee中发生的调试事件的信息.dwMilliseconds 该函数等待调试事件的时间,以毫秒为单位.如果这段时间没有调试事件发生, WaitForDebugEvent返回调用者.另一方面,如果将该参数指定为 INFINITE 常数,函数将一直等待直到调试事件发生.现在我们看一下DEBUG_EVENT 结构.DEBUG_EVENT STRUCTdwDebugEventCode dd ?dwProcessId dd ?dwThreadId dd ?u DEBUGSTRUCT <>DEBUG_EVENT ENDSdwDebugEventCode 该值指定了等待发生的调试事件的类型.因为有很多种类型的事件发生,我们的程序要检查该值,知道要发生事件的类型并做出响应. 该值可能的取值如下:取值含义CREATE_PROCESS_DEBUG_EVENT 进程被创建.当debuggee进程刚被创建(还未运行) 或我们的程序刚以DebugActiveProcess被捆绑到一个运行中的进程时事件发生. 这是我们的程序应该获得的第一个事件.EXIT_PROCESS_DEBUG_EVENT 进程退出.CREATE_THEAD_DEBUG_EVENT 当一个新线程在deuggee进程中创建或我们的程序首次捆绑到运行中的进程时事件发生.要注意的是当debugge的主线程被创建时不会收到该通知.EXIT_THREAD_DEBUG_EVENT debuggee中的线程退出时事件发生.debugee的主线程退出时不会收到该通知.我们可以认为debuggee的主线程与debugge进程是同义词. 因此, 当我们的程序看到CREATE_PROCESS_DEBUG_EVENT标志时,对主线程来说,就是CREATE_THREAD_DE BUG_EVENT标志.LOAD_DLL_DEBUG_EVENT debuggee装入一个DLL.当PE装载器第一次分解指向DLL的链接时,我们将收到这一事件. (当调用CreateProcess装入 debuggee时)并且当debuggee调用LoadLibrary时也会发生.UNLOAD_DLL_DEBUG_EVENT 一个DLL从debuggee中卸载时事件发生.EXCEPTION_DEBUG_EVENT 在debuggee中发生异常时事件发生. 注意: 该事件仅在debu ggee开始它的第一条指令之前发生一次.异常实际上是一个调试中断(int 3h).如果想恢复debuggee事,以 DBG_CONTINUE 标志调用ContinueDebugEvent 函数. 不要使用DBG_EXCEPT ION_NOT_HANDLED 标志否则debuggee会在NT下拒绝运行(Win98下运行得很好).OUTPUT_DEBUG_STRING_EVENT 当debuggee调用DebugOutputString函数向我们的程序发送消息字符串时该事件发生.RIP_EVENT 系统调试发生错误dwProcessId 和dwThreadId发生调试事件的进程和线程Id.我们可以用这些值作为我们感兴趣的进程或线程的标志符.记住如果我们使用CreateProcess来装载debuggee,我们仍可在PROCESS_INFO结构中获得debuggee的进程和线程.我们可以用这些值来区别调试事件是发生在debuggee中还是它的子进程中(当没有指定 DEBUG_ONLY_THIS_PROCESS 标志时).u 是一个联合,包含了调试事件的更多信息.根据上面dwDebugEventCode的不同,它可以是以下结构:dwDebugEventCode u的解释CREATE_PROCESS_DEBUG_EVENT 名为CreateProcessInfo的CREATE_PROCESS_DEBUG_INF O结构EXIT_PROCESS_DEBUG_EVENT 名为ExitProcess的EXIT_PROCESS_DEBUG_INFO结构CREATE_THREAD_DEBUG_EVENT 名为CreateThread的CREATE_THREAD_DEBUG_INFO结构EXIT_THREAD_DEBUG_EVENT 名为ExitThread的EXIT_THREAD_DEBUG_EVENT 结构LOAD_DLL_DEBUG_EVENT 名为LoadDll的LOAD_DLL_DEBUG_INFO 结构UNLOAD_DLL_DEBUG_EVENT 名为UnloadDll的UNLOAD_DLL_DEBUG_INFO结构EXCEPTION_DEBUG_EVENT 名为Exception的EXCEPTION_DEBUG_INFO结构OUTPUT_DEBUG_STRING_EVENT 名为DebugString的OUTPUT_DEBUG_STRING_INFO 结构RIP_EVENT 名为RipInfo的RIP_INFO 结构我不会在这一个教程里讲所有这些结构的细节,这里只详细讲一下CREATE_PROCESS_DE BUG_INFO 结构.假设我们的程序调用了WaitForDebugEvent函数并返回,我们要做的第一件事就是检查dwDebugEventCode中的值来看debuggee进程中发生了那种类型的调试事件.比如说,如果d wDebugEventCode的值为 CREATE_PROCESS_DEBUG_EVENT,就可认为u的成员为CreateProce ssInfo 并用u.CreateProcessInfo来访问.在我们的程序中做对调试事件的响应. 当WaitForDebugEvent 返回时,这意味着在deb uggee进程中发生了调试事件或者发生了超时.所以我们的程序要检查dwDebugEventCode 来作出适当的反应.这里有些象处理Windows消息:由用户来选择和忽略消息.继续运行debuggee. 当调试事件发生时, Windows挂起了debuggee,所以当我们处理完调试事件,还要让debuggee继续运行.调用ContinueDebugEvent 函数来完成这一过程.ContinueDebugEvent proto dwProcessId:DWORD, dwThreadId:DWORD, dwContinueSta tus:DWORD该函数恢复由于调试事件而挂起的线程.dwProcessId和dwThreadId是要恢复的线程的进程ID和线程ID,通常这两个值从 DEB UG_EVENT结构的dwProcessId 和dwThreadId成员获得.dwContinueStatus显示了如何继续报告调试事件的线程.可能的取值有两个: DBG_CON TINUE 和DBG_EXCEPTION_NOT_HANDLED. 对大多数调试事件,这两个值都一样:恢复线程.唯一的例外是EXCEPTION_DEBUG_EVENT,如果线程报告发生了一个异常调试事件,这意味着在d ebuggee的线程中发生了一个异常.如果指定了DBG_CONTINUE,线程将忽略它自己的异常处理部分并继续执行.在这种情况下,我们的程序必须在以DBG_CONTINUE恢复线程之前检查并处理异常,否则异常将生生不息地不断发生....如果我们指定了 DBG_EXCEPTION_NOT_HANDL ED值,就是告诉Windows我们的程序并不处理异常:Windows将使用debuggee的默认异常处理函数来处理异常.总而言之,如果我们的程序没有考虑异常,而调试事件又指向debuggee进程中的一个异常的话,就应调用含DBG_CONTINUE标志的ContinueDebugEvent函数.否则,我们的程序就必须以DBG_EXCEPTION_NOT_HANDLED调用 ContinueDebugEvent.但在下面这种情况下必须使用DBG_CONTINUE标志:第一个在ExceptionCode成员中有值EXCEPTION_BREAKPOINT的 EXC EPTION_DEBUG_EVENT事件.当debuggee开始执行它的第一条指令时,我们的函数将接受到异常调试事件.它事实上是一个调试中断(int 3h).如果我们以DBG_EXCEPTION_NOT_HANDLED 调用ContinueDebugEvent 来响应调试事件, Windows NT会拒绝执行debuggee(因为它没有异常处理).所以在这种情况下,要用DBG_CONTINUE标志告诉Windows我们希望该线程继续执行.继续上面的步骤循环直到debuggee进程退出. 我们的程序必须在一个很象消息循环的无限循环中直到debuggee结束.该循环大体如下:.while TRUEinvoke WaitForDebugEvent, addr DebugEvent, INFINITE.break .if DebugEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT<调试事件处理>invoke ContinueDebugEvent, DebugEvent.dwProcessId, DebugEvent.dwThreadId, DBG_E XCEPTION_NOT_HANDLED.endw就是说,当开始调试程序时,我们的程序不能和debuggee分开直到它结束.我们再来总结一下这些步骤:创建一个进程或捆绑我们的程序到运行中的进程上.等待调试事件响应调试事件.继续执行debuggee.继续这一无尽循环直到debuggee进程结束例子:这个例子调试一个win32程序并显示诸如进程句柄,进程Id,映象基址等..386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\comdlg32.incinclude \masm32\include\user32.incincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\comdlg32.libincludelib \masm32\lib\user32.lib.dataAppName db "Win32 Debug Example no.1",0ofn OPENFILENAME <>FilterString db "Executable Files",0,"*.exe",0db "All Files",0,"*.*",0,0ExitProc db "The debuggee exits",0NewThread db "A new thread is created",0EndThread db "A thread is destroyed",0ProcessInfo db "File Handle: %lx ",0dh,0Ahdb "Process Handle: %lx",0Dh,0Ahdb "Thread Handle: %lx",0Dh,0Ahdb "Image Base: %lx",0Dh,0Ahdb "Start Address: %lx",0.data?buffer db 512 dup(?)startinfo STARTUPINFO <>pi PROCESS_INFORMATION <>DBEvent DEBUG_EVENT <>.codestart:mov ofn.lStructSize,sizeof ofnmov ofn.lpstrFilter, offset FilterStringmov ofn.lpstrFile, offset buffermov ofn.nMaxFile,512mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_E XPLORER or OFN_HIDEREADONLYinvoke GetOpenFileName, ADDR ofn.if eax==TRUEinvoke GetStartupInfo,addr startinfoinvoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+ DEBU G_ONLY_THIS_PROCESS, NULL, NULL, addr startinfo, addr pi.while TRUEinvoke WaitForDebugEvent, addr DBEvent, INFINITE.if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENTinvoke MessageBox, 0, addr ExitProc, addr AppName, MB_OK+MB_ICONINFORMATION.break.elseif DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENTinvoke wsprintf, addr buffer, addr ProcessInfo, DBEvent.u.CreateProcessInfo.hFi le, DBEvent.u.CreateProcessInfo.hProcess, DBEvent.u.CreateProcessInfo.hThread, DBEvent.u.CreateProcessInfo.lpBaseOfImage, DBEvent.u.CreateProcessInfo.lpStartA ddressinvoke MessageBox,0, addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION.elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT.if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINU E.continue.endif.elseif DBEvent.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENTinvoke MessageBox,0, addr NewThread, addr AppName, MB_OK+MB_ICONINFORMATION.elseif DBEvent.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENTinvoke MessageBox,0, addr EndThread, addr AppName, MB_OK+MB_ICONINFORMATION.endifinvoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTI ON_NOT_HANDLED.endwinvoke CloseHandle,pi.hProcessinvoke CloseHandle,pi.hThread.endifinvoke ExitProcess, 0end start分析:程序首先填充OPENFILENAME结构,调用GetOpenFileName让用户选择要调试的程序. invoke GetStartupInfo,addr startinfoinvoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+ DEBU G_ONLY_THIS_PROCESS, NULL, NULL, addr startinfo, addr pi当接收用户选择后,调用CreateProcess装载程序.并调用GetStartupInfo以默认值填充STARTUPINFO结构.注意我们将DEBUG_PROCESS标志与DEBUG_ONLY_THIS_PROCESS标志组合来仅调试这个程序,不包括子进程..while TRUEinvoke WaitForDebugEvent, addr DBEvent, INFINITE在debuggee被装入后,我们调用WaitForDebugEvent进入无尽的调试循环,WaitForDeb ugEvent在debuggee中发生调试事件时返回,因为我们指定了INFINITE作为第二个参数.当调试事件发生时, WaitForDebugEvent 返回并填充DBEvent结构.本文来自编程入门网---w .if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENTinvoke MessageBox, 0, addr ExitProc, addr AppName, MB_OK+MB_ICONINFORMATION.break我们要先检查dwDebugEventCode的值, 如果是EXIT_PROCESS_DEBUG_EVENT,用一个消息框显示"The debuggee exits" 并退出调试循环..elseif DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENTinvoke wsprintf, addr buffer, addr ProcessInfo, DBEvent.u.CreateProcessInfo.hFi le, DBEvent.u.CreateProcessInfo.hProcess, DBEvent.u.CreateProcessInfo.hThread, DBEvent.u.CreateProcessInfo.lpBaseOfImage, DBEvent.u.CreateProcessInfo.lpStartA ddressinvoke MessageBox,0, addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION 如果dwDebugEventCode 的值为CREATE_PROCESS_DEBUG_EVENT,我们就在消息框中显示一些感兴趣的底层信息.这些信息从u.CreateProcessInfo获得. CreateProcessInfo是一个CREATE_PROCESS_DEBUG_INFO类型的结构体.你可以查阅Win32 API获得它的更多信息e..elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT.if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINU E.continue.endif如果dwDebugEventCode 的值为EXCEPTION_DEBUG_EVENT,我们就要更进一步检查异常类型.它是一大堆的结构嵌套,但我们可以从ExceptionCode成员获得异常类型.如果ExceptionCode的值为 EXCEPTION_BREAKPOINT并且是第一次发生(或者我们已知道deuggee中没有int 3h指令),我们可以安全地假定在debuggee要执行第一条指令时发生这一异常.在我们完成这些处理后,就可以用 DBG_CONTINUE调用ContinueDebugEvent来继续执行debuggee.接着我们继续等待下一个调试事件的发生..elseif DBEvent.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENTinvoke MessageBox,0, addr NewThread, addr AppName, MB_OK+MB_ICONINFORMATION.elseif DBEvent.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENTinvoke MessageBox,0, addr EndThread, addr AppName, MB_OK+MB_ICONINFORMATION.endif如果dwDebugEventCode 的值为CREATE_THREAD_DEBUG_EVENT或EXIT_THREAD_DEBUG_E VENT, 我们的程序显示一个消息框.invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTI ON_NOT_HANDLED.endw除了上面讨论过的 EXCEPTION_DEBUG_EVENT,用DBG_EXCEPTION_NOT_HANDLED标志调用ContinueDebugEvent函数恢复debuggee的执行.invoke CloseHandle,pi.hProcessinvoke CloseHandle,pi.hThread当debuggee结束时,我们就跳出了调试循环,这时要关闭 debuggee的线程和进程句柄.关闭这些句柄并不意味着要关闭这些进程和线程.只是说不再用这些句柄罢了.。

WinDBG调试命令大全

WinDBG调试命令大全

WinDBG调试命令⼤全转载收藏于:#调试命令窗⼝+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#使⽤gflags.exe⼯具(在windbg所在⽬录下),让某个进程启动时,拉取windbg进⾏调试如下截图:当名称为captcomm.exe的进程启动时,拉起windbg调试也可通过脚本命令来实现:// 运⾏captcomm.exe时,启动windbg调试reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f// 解除启动时windbg调试reg delete"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f// 64位系统上,也可以设置以下注册表节点reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f// 解除启动时windbg调试reg delete"HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f// 测试发现:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options和HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options指向的是同⼀数据,修改其中任何⼀安全软件可能会禁⽌修改注册表的Image File Execution项:-- 对于360安全卫⼠,在“设置”中去掉“开启360⾃我保护”的勾选来关闭-- 对于McAfee,需要禁⽌IPS(Intrusion Prevension Systems)。

win32api的使用方法

win32api的使用方法

win32api的使用方法
win32api的使用方法主要包括以下几种:
1. 调用win32api函数,如GetCursorPos()函数获取光标位置。

具体地,需要在代码中声明一个POINT结构体,然后使用DllImport属性导入动态链接库,最后调用GetCursorPos()函数并将返回的光标位置赋值给POINT 结构体中的X和Y属性。

2. 使用invoke语句调用API函数。

在MASM汇编语言中,可以使用invoke语句来调用API函数,并指定函数的参数。

编译器会检查参数的数量和类型是否正确,如果参数少了或者类型不匹配,会报错。

3. 在调用API函数之前,需要先声明该函数。

声明的格式包括函数名、原型、距离、语言和参数列表,其中参数列表包括每个参数的名称、数据类型和修饰符。

需要注意的是,win32api的使用需要一定的编程基础和经验,因此在学习使用win32api之前,建议先学习相关的编程语言和基础知识。

同时,win32api的使用也需要考虑到操作系统的版本和位数,不同的操作系统版本和位数可能会对API函数的可用性和行为产生影响。

因此,在使用
win32api时,需要注意选择正确的API函数并了解其用法和限制。

win32错误报告

win32错误报告

win32错误报告在使用计算机的日常生活中,我们难免会遇到各种各样的问题和错误。

其中之一就是Win32错误,它常常会弹出一个错误报告窗口,让人困惑和烦恼。

在本文中,我们将深入探讨Win32错误的原因、常见类型和解决方法,帮助读者更好地理解和应对这一问题。

Win32错误是指一种特定的错误类型,通常与Windows操作系统相关。

它可能在程序运行时发生,也可能在安装软件或驱动程序时出现。

Win32错误报告中列出了错误代码和简短的描述,让用户对错误有初步的了解。

然而,对于大多数用户来说,代码和描述只是一堆晦涩的符号和名词,很难理解其含义。

因此,我们有必要深入了解Win32错误并寻找解决办法。

首先,让我们来看看Win32错误的几种常见类型。

最常见的类型是文件相关错误。

当您尝试打开、读取或写入文件时,可能会遇到错误代码2(文件未找到)或错误代码5(拒绝访问)。

这意味着您所指定的文件路径不正确或您没有足够的权限来访问该文件。

另一个常见类型是内存错误,其中错误代码常见为异常代码0xc0000005。

这可能是由于程序访问了未分配的内存,或者试图读取或写入受保护的内存区域。

此外,网络相关错误也是常见的Win32错误类型。

当您的计算机无法连接到互联网或无法访问特定的网络资源时,错误代码常见为12002或12007。

这通常由于网络设置错误、防火墙设置等引起。

这只是Win32错误的一小部分,每种类型都有特定的错误代码和描述。

那么,当我们遇到Win32错误时该怎么办呢?首先,我们应该尝试理解错误报告中的代码和描述。

虽然有时它们可能会使人感到困惑,但它们提供了一些有关错误的线索。

比如,错误代码2(文件未找到)意味着您需要检查文件路径是否正确,或者确保文件是否被删除或移动。

错误码5(拒绝访问)则提示您缺乏足够的权限来访问文件。

其次,我们可以尝试重启计算机。

有时,Win32错误可能只是一次临时问题,通过重新启动计算机,许多错误可能就会自行解决。

win32api outputdebugstring重定向原理

win32api outputdebugstring重定向原理

win32api outputdebugstring重定向原理Win32API OutputDebugString 重定向原理OutputDebugString是Win32API中用来向调试器输出调试信息的函数,通常用于在调试过程中输出调试信息以便进行调试和排查问题。

但有时我们希望将OutputDebugString输出的信息重定向到其他地方,比如日志文件或者其他程序中进行处理。

本文将介绍如何实现OutputDebugString的重定向原理。

在Win32API中,OutputDebugString函数的原型如下:```cvoid OutputDebugString(LPCTSTR lpOutputString);```其中,lpOutputString参数为要输出的调试信息字符串。

当调用OutputDebugString函数时,系统会将lpOutputString中的内容发送到调试器进行显示。

要实现OutputDebugString的重定向,我们可以通过Hook的方式来劫持OutputDebugString函数的调用,并将调试信息输出到我们指定的地方。

具体步骤如下:1. 获取OutputDebugString函数的地址首先,我们需要获取OutputDebugString函数的地址,这可以通过GetProcAddress函数来实现。

OutputDebugString函数通常位于Kernel32.dll中,我们可以通过LoadLibrary函数加载Kernel32.dll,然后使用GetProcAddress函数获取OutputDebugString函数的地址。

2. 创建自定义的OutputDebugString函数接下来,我们需要编写自定义的OutputDebugString函数,该函数将用来替代系统的OutputDebugString函数。

在自定义函数中,我们可以将调试信息输出到我们指定的地方,比如日志文件中。

LCC-win32

LCC-win32

LCC-Win32小指南By Daniel Guerrero Miralles翻译:pigprince声明本文没有任何明确的或者含蓄的表达说明本文是完全正确的,对于应用本文内容所产生的任何结果,本人概不负责。

请原谅本文在语言和语法的的运用上的错误,本人才疏学浅,这是不可避免的。

如果有什么你觉得不舒服的地方请联系pigprince,先谢谢了_________________________________________________________________LCC-Win32介绍LCC-Win32原来是一个免费的开放源代码WIN32编译器,包含一个很好用的IDE,用起来很爽,但是最近源码开始要付费的了(40美圆)。

详情请见LCC-Win32官方网站。

它的免费版本可以在国内得到,到云风工作室看一下,你会有所收获。

目录* 简介* 编译器的安装* Lcc-Win32的一些基本概念* 写个小程序!* 使用工程管理* 第一个Windows程序* 程序生成向导* 使用WeditRes创建资源* 添加其它类型的资源* 使用非规格资源* 静态库和动态库简介其实所谓的简介这个部分的内容趋向取决于作者。

但是我所读过的一些指南都是由一个“简介”开始的,这部分的内容通常都是在重复读者会在下面看到的东西,但是也有的简介只是作者的一些想法。

仔细的想一下,其实这个介绍并不是一件简单的事情。

首先,如果你要是开门见山的直奔主题,这是不礼貌的,而且基于web的指南也不应该有超大个的简介,不应该让读者在这个东西上浪费时间和金钱。

看来我的废话也够多的了,让我们切入正题。

这个指南是单页的,建议你等浏览器下载完毕后保存一份拷贝来离线阅读。

编译器的安装编译器的安装简单极了,只要把您下载的文件运行一下就OK了,应该不会遇到什么问题。

但是注意安装的最后要编译库文件,可能要花点时间,要视你的机器速度而定。

Lcc-Win32的一些基本概念Lcc-Win32编译系统是由多个文件构成的。

win32exception error creating window handle

win32exception error creating window handle

win32exception error creating window handle怎么解决"Win32Exception: Error creating window handle"是一个常见的错误,通常发生在Windows应用程序中,表示在创建窗口句柄时出现了问题。

以下是一些可能的解决方法:1. 释放资源:确保在使用完窗口句柄后,及时释放资源。

特别是在使用一些不受管理的资源(如GDI对象)时,确保及时释放它们,以免导致句柄泄漏。

2. 优化代码:检查你的代码,确保没有不必要的窗口句柄创建和销毁。

避免频繁创建和销毁窗口,而是尽可能重用已有的窗口句柄。

3. 检查资源限制:检查系统资源限制,确保你的应用程序没有超过系统允许的窗口句柄数量。

你可以使用Windows资源监视器或类似的工具来监视系统资源的使用情况。

4. 处理异常:在创建窗口句柄的代码块周围使用try-catch语句,以捕获可能导致异常的情况。

这可以帮助你更好地理解问题的根本原因。

5. 升级.NET Framework:如果你的应用程序使用.NET Framework,确保你正在使用最新版本。

有时,使用过时的.NET Framework版本可能导致一些问题。

6. 检查第三方库和控件:如果你使用了第三方库或控件,确保它们是最新版本,且与你的应用程序兼容。

有时,使用不稳定或过时的库可能导致窗口句柄问题。

7. 使用专业工具:使用一些专业的工具来帮助你分析和诊断问题,例如Sysinternals Suite 中的Process Explorer。

这些工具可以提供更详细的系统资源使用信息。

8. 查看Windows日志:检查Windows事件查看器,查看是否有与窗口句柄创建相关的错误或警告。

这可能提供一些关于问题的线索。

记住,解决此问题可能需要根据你的具体情况进行调试和试验。

根据错误消息和你的应用程序的上下文,你可能需要采用一种或多种方法来解决问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在Win32中自带了一些API函数,它们提供了相当于一般调试器的大多数功能,这些函数统称为Win32调试API(Win32 Debug API)。

利用这些API可以做到加载一个程序或捆绑到一个正在运行的程序上以供调试;可以获得被调试的程序的底层信息,例如进程ID、进入地址、映像基址等;甚至可以对被调试的程序进行任意的修改,包括进程的内存、线程的运行环境等。

简而言之,读者可以用这些API写一个进程调试器。

就像现在流行的调试器Visual C++调试器、WinDBG、OllyDbg等一样。

当然除了能写调试器外,利用调试API还能做很多不同寻常的工作。

3.1 Win32调试API原理3.1.1 调试相关函数简要说明Windows提供了一组Win32 Debug API,其具体定义如下。

(1)ContinueDebugEvent函数说明:此函数允许调试器恢复先前由于调试事件而挂起的线程。

语法:BOOLContinueDebugEvent(DWORD dwProcessId,DWORD dwThreadId, DWORD dwContin ueStatus )参数:dwProcessId DWORD 被调试进程的进程标识符dwThreadId DWORD 欲恢复线程的线程标识符dwContinueStatus DWORD 此值指定了该线程将以何种方式继续,包含两个定义值DBG_CONTINUE和DBG_EXCEPTION_NOT_HANDLED返回值 BOOL 如果函数成功,则返回非零值;如果失败,则返回零(2)DebugActiveProcess说明:此函数允许将调试器捆绑到一个正在运行的进程上。

语法:BOOL DebugActiveProcess(DWORD dwProcessId )参数:dwProcessId DWORD 欲捆绑进程的进程标识符返回值BOOL 如果函数成功,则返回非零值;如果失败,则返回零(3)DebugActiveProcessStop说明:此函数允许将调试器从一个正在运行的进程上卸载。

语法:BOOL DebugActiveProcessStop(DWORD dwProcessId )参数:dwProcessId DWORD 欲卸载的进程的进程标识符返回值BOOL 如果函数成功,则返回非零值;如果失败,则返回零注意:Windows 9x内核不支持此函数。

(4)DebugBreak说明:在当前进程中产生一个断点异常,如果当前进程不是处在被调试状态,那么这个异常将被系统例程接管,多数情况下会导致当前进程被终止。

语法:VOID DebugBreak(VOID)参数:无其他:其实这个函数的用处与在程序中直接插入INT 3的效果是一样的,如果反编译Windows 98的KERNEL32.dll,读者可以发现这个函数只包含两句,一句是INT 3,一句是RET。

(5)DebugBreakProcess说明:在指定进程中产生一个断点异常。

语法:VOID DebugBreakProcess (HANDLE hProcess)参数:hProcess HANDLE 进程的句柄返回值无(6)FatalExit说明:此函数将使调用进程强制退出,将控制权转移至调试器。

与ExitProcess不同的是,在退出前会先调用一个INT 3断点。

语法:VOID FatalExit(int ExitCode)参数:ExitCode int 退出码返回值无(7)FlushInstructionCache说明:刷新指令高速缓存。

语法:BOOLFlushInstructionCache(HANDLE hProcess, LPCVOID lpBassAddress, SIZE_T dwSize) 参数:hProcess HANDLE 进程的句柄lpBassAddress LPCVOID 欲刷新区域的基地址dwSize SIZE_T 欲刷新区域的长度返回值BOOL 如果函数成功,则返回非零值;如果失败,则返回零(8)GetThreadContext说明:获取指定线程的执行环境。

语法:BOOL GetThreadContext(HANDLE hThread, LPCONTEXT lpContext )参数:hThread HANDLE 欲获取执行环境的线程的句柄lpContext LPCONTEXT 指向CONTEXT结构的指针返回值BOOL 如果函数成功,则返回非零值;如果失败,则返回零(9)GetThreadSelectorEntry说明:此函数返回指定选择器和线程的描述符表的入口地址。

语法:BOOLGetThreadSelectorEntry( HANDLE hThread,DWORD dwSelector, LPLDT_ENTRY lp SelectorEntry )参数:hThread HANDLE 包含指定选择器的线程的句柄dwSelector DWORD 选择器数目lpSelectorEntry LPLDT_ENTRY 指向用来接收描述符表的结构的指针返回值如果函数成功,则返回非零值,此外lpSelectorEntry指向的结构中将被填入接收到的描述符表;如果失败,则返回零(10)IsDebuggerPresent说明:此函数用来判断调用进程是否处于被调试环境中。

语法:BOOL IsDebuggerPresent(VOID)参数:返回值BOOL:如果进程处在被调试状态,则返回非零值,不是处在被调试状态则返回零(11)OutputDebugString说明:将一个字符串传递给调试器显示。

语法:VOID OutputDebugString(LPCYSTR lpOutputString)参数:lpOutputString LPCYSTR:指向要显示的以“00”结尾的字符串的指针返回值无(12)ReadProcessMemory说明:读取指定进程的某区域内的数据。

语法:BOOLReadProcessMemory(HANDLE hProcess, LPCVOID lpBassAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T * lpNumberOfBytesRead)参数:hProcess HANDLE 进程的句柄lpBassAddress LPCVOID 欲读取区域的基地址lpBuffer LPVOID 保存读取数据的缓冲的指针nSize SIZE_T 欲读取的字节数lpNumberOfBytesRead SIZE_T 存储已读取字节数的地址指针返回值BOOL:如果函数成功,则返回非零值;如果失败,则返回零(13)SetThreadContext说明:设置指定线程的执行环境。

语法:BOOL SetThreadContext(HANDLE hThread, LPCONTEXT lpContext )参数:hThread HANDLE 欲设置执行环境的线程的句柄lpContext LPCONTEXT 指向CONTEXT结构的指针返回值BOOL:如果函数成功,则返回非零值;如果失败,则返回零(14)WaitForDebugEvent说明:此函数用来等待被调试进程发生调试事件。

语法:BOOLWaitForDebugEvent(LPDEBUG_ENENT lpDebugEvent, DWORD dwMilliseconds)参数:lpDebugEvent LPDEBUG_ENENT 指向接收调试事件信息的DEBUG_ ENENT结构的指针dwMilliseconds DWORD 该函数用来等待调试事件发生的毫秒数,如果这段时间内没有调试事件发生,函数将返回调用者;如果将该参数指定为INFINITE,函数将一直等待直到调试事件发生返回值BOOL:如果函数成功,则返回非零值;如果失败,则返回零(15)WriteProcessMemory说明:在指定进程的某区域内写入数据。

语法:BOOLWriteProcessMemory(HANDLE hProcess, LPCVOID lpBassAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T * lpNumberOfBytesRead)参数:hProcess HANDLE 进程的句柄lpBassAddress LPCVOID 欲写入区域的基地址lpBuffer LPVOID 保存欲写入数据的缓冲的指针nSize SIZE_T 欲写入的字节数lpNumberOfBytesRead SIZE_T 存储已写入字节数的地址的指针返回值BOOL:如果函数成功,则返回非零值;如果失败,则返回零3.1.2 调试事件1.typedef struct _DEBUG_EVENT {2.DWORD dwDebugEventCode;3.DWORD dwProcessId;4.DWORD dwThreadId;5.union {6.EXCEPTION_DEBUG_INFO Exception;7.CREATE_THREAD_DEBUG_INFO CreateThread;8.CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;9.EXIT_THREAD_DEBUG_INFO ExitThread;10.EXIT_PROCESS_DEBUG_INFO ExitProcess;11.LOAD_DLL_DEBUG_INFO LoadDll;12.UNLOAD_DLL_DEBUG_INFO UnloadDll;13.OUTPUT_DEBUG_STRING_INFO DebugString;14.RIP_INFO RipInfo;15.} u;16.} DEBUG_EVENT;CREATE_PROCESS_DEBUG_INFO结构定义:view plaincopy to clipboardprint?1.typedef struct _CREATE_PROCESS_DEBUG_INFO {2.HANDLE hFile; // 进程文件的句柄,利用它可对文件进行操作3.HANDLE hProcess; // 进程的句柄,在进程空间中进行读写操作时要用到它4.HANDLE hThread; // 主线程的句柄,在读取、设置线程环境时都要用到它5.LPVOID lpBaseOfImage; // 进程执行的映像基地址6.DWORD dwDebugInfoFileOffset;7.DWORD nDebugInfoSize;8.LPVOID lpThreadLocalBase;9. LPTHREAD_START_ROUTINE lpStartAddress;10.LPVOID lpImageName;11.WORD fUnicode;12.} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;3.1.3 如何在调试时创建并跟踪一个进程这是使用Win32调试API的第一步。

相关文档
最新文档