- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Application Verifier 说运行代码时存在访问冲突:
var
shi: TShellExecuteInfo;
begin
shi := Default(TShellExecuteInfo);
shi.cbSize := SizeOf(TShellExecuteInfo);
shi.lpFile := PChar('C:\Windows');
ShellExecuteEx(@shi);
end;
这是怎么回事?
我正在 Application Verifier 下运行我的应用程序,启用检测堆损坏的选项:
在调用 ShellExecuteEx 期间,出现异常,表明存在堆损坏。
在调试器中运行允许我解码异常:
ExceptionAddress: 0000000074b254ad (KERNELBASE!ParseURLW+0x000000000000002d)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: 0000000008e26fe8
Attempt to read from address 0000000008e26fe8
在调试器之外运行,应用程序崩溃(WerFault 进行事后分析,进程终止)。
代码有什么问题?
program ShellExecuteTestApp;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
Winapi.ShellAPI;
var
shi: TShellExecuteInfo;
begin
try
shi := Default(TShellExecuteInfo);
shi.cbSize := SizeOf(TShellExecuteInfo);
shi.lpFile := PChar('C:\Windows');
WriteLn('shi.cbSize: '+IntToStr(shi.cbSize));
WriteLn('shi.lpFile: "'+shi.lpFile+'"');
ShellExecuteEx(@shi);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
在崩溃之前,它输出:
shi.cbSize: 60
shi.lpFile: "C:\Windows"
我想也许是 common bug from CreateProcess ,所以我确保 lpFile
是可写的:
var
file: string;
shi: TShellExecuteInfo;
begin
file := 'C:\Windows';
UniqueString({var} file);
shi := Default(TShellExecuteInfo);
shi.cbSize := SizeOf(TShellExecuteInfo);
shi.lpFile := PChar(file);
ShellExecuteEx(@shi);
end;
使用 32 位构建(使指针更易于阅读),将内存传递给 ShellExecuteEx
00423EBC 0000003C cbSize 60 bytes
00000000 fMask SEE_MASK_DEFAULT
00000000 Wnd null
00000000 lpVerb null
0041C600 lpFile ==> 0x0041C60C
00000000 lpParameters null
00000000 lpDirectory null
00000001 nShow SW_NORMAL
00000000 hInstApp 0
00000000 lpIDList null
00000000 lpClass null
00000000 hkeyClass 0
00000000 dwHotKey 0
00000000 hMonitor null
00000000 hProcess null
用一个指向宽字符的指针:
0041C60C 43 00 3A 00 5C 00 57 00 C.:.\.W.
0041C614 69 00 6E 00 64 00 6F 00 i.n.d.o.
0041C61C 77 00 73 00 00 00 00 00 w.s.....
然后调用:
ShellExecuteTestApp.dpr.29: ShellExecuteEx(@shi);
0041C51F 68BC3E4200 push $00423ebc ;push address of shi structure
0041C524 E85BD6FFFF call ShellExecuteEx ;call imported function
Winapi.ShellAPI.pas.1798: function ShellExecuteEx; external shell32 name 'ShellExecuteExW';
00419B84 FF250C444200 jmp dword ptr [$0042440c] ;jump to ShellExecuteW inside shell32
shell32.ShellExecuteExW:
75520060 8BFF mov edi,edi
75520062 55 push ebp
75520063 8BEC mov ebp,esp
75520065 83E4F8 and esp,-$08
75520068 51 push ecx
75520069 53 push ebx
7552006A 56 push esi
7552006B 8B7508 mov esi,[ebp+$08]
7552006E 57 push edi
7552006F 833E3C cmp dword ptr [esi],$3c
75520072 7540 jnz $755200b4
75520074 8B5E04 mov ebx,[esi+$04]
75520077 F7C300011000 test ebx,$00100100
7552007D 7427 jz $755200a6
7552007F 8BCE mov ecx,esi
75520081 E836000000 call $755200bc --> failure is this way
然后有很多东西我无法理解,直到错误最终发生在 ParseUrlW 中:
HRESULT ParseURL(
_In_ LPCTSTR pcszUrl,
_Inout_ PARSEDURL *ppu
);
转储:
KERNELBASE.ParseURLW:
74B25480 8BFF mov edi,edi
74B25482 55 push ebp
74B25483 8BEC mov ebp,esp ;save stack pointer
74B25485 8B4508 mov eax,[ebp+$08] ;restore pcszUrl into EAX
74B25488 83EC0C sub esp,$0c
74B2548B 85C0 test eax,eax ;test that pcszUrl param supplied
74B2548D 0F8493010000 jz $74b25626
注意:此时EAX包含地址0x0908BFE8:
0908BFE8: 00 00 00 00 00 00 00 00 ........
提供的 pcszUrl 字符串为空?实际上不是,地址是无效的。但在代码尝试触及它之前我们还不知道这一点
74B25493 57 push edi ;save EDI
74B25494 8B7D0C mov edi,[ebp+$0c] ;get PARSEDURL into edi
74B25497 85FF test edi,edi
74B25499 0F8410630300 jz $74b5b7af
注意:此时edi包含0977FBDC
PARSEDURL structure
0977FBCD 00000018 cbSize 24 bytes
753F5BC0 pszProtocol [uninitialized junk]
0977FEC4 cchProtocol [uninitialized junk]
092ECFC8 pszSuffix [uninitialized junk]
78E6E41E cchSuffix [uninitialized junk]
0977FE98 nScheme [uninitialized junk]
74B2549F 833F18 cmp dword ptr [edi],$18 ;test that struct size is what we expect (24 bytes)
74B254A2 0F8507630300 jnz $74b5b7af
74B254A8 53 push ebx ;save ebx
74B254A9 8BD0 mov edx,eax ;save pcszUrl into edx
74B254AB 33DB xor ebx,ebx
74B254AD 0FB700 movzx eax,[eax] ;Attempt to copy 4 bytes of the string into EAX (access violation)
代码尝试使用 Move with Zero-Extend 从 0x0908BFE8 复制第一个单词.但该地址无效,导致访问冲突:
access violation at 0x74b254ad: read of address 0x0908bfe8
所以在 ShellExecuteExW 代码的某处,它设置了对 ParseUrlW 的无效调用。
32 位 WinDbg,调试 32 位应用程序,带符号:
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
*** ERROR: Module load completed but symbols could not be loaded for image00400000
FAULTING_IP:
KERNELBASE!ParseURLW+2d
74b254ad 0fb700 movzx eax,word ptr [eax]
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 74b254ad (KERNELBASE!ParseURLW+0x0000002d)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 07634fe8
Attempt to read from address 07634fe8
CONTEXT: 00000000 -- (.cxr 0x0;r)
eax=07634fe8 ebx=00000000 ecx=07634fe8 edx=07634fe8 esi=00000000 edi=093dfbdc
eip=74b254ad esp=093dfbb4 ebp=093dfbc8 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010246
KERNELBASE!ParseURLW+0x2d:
74b254ad 0fb700 movzx eax,word ptr [eax] ds:002b:07634fe8=????
FAULTING_THREAD: 00003ff4
DEFAULT_BUCKET_ID: INVALID_POINTER_READ
PROCESS_NAME: image00400000
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 07634fe8
READ_ADDRESS: 07634fe8
FOLLOWUP_IP:
shell32!GetUrlSchemeW+28
754c66be 85c0 test eax,eax
NTGLOBALFLAG: 2000100
APPLICATION_VERIFIER_FLAGS: 80000001
APP: image00400000
ANALYSIS_VERSION: 6.3.9600.17237 (debuggers(dbg).140716-0327) x86fre
PRIMARY_PROBLEM_CLASS: INVALID_POINTER_READ
BUGCHECK_STR: APPLICATION_FAULT_INVALID_POINTER_READ
LAST_CONTROL_TRANSFER: from 754c66be to 74b254ad
STACK_TEXT:
093dfbc8 754c66be 07634fe8 093dfbdc 00000000 KERNELBASE!ParseURLW+0x2d
093dfbf8 75522df8 0746fff0 07604f68 00000002 shell32!GetUrlSchemeW+0x28
093dfe98 75522b1a 093dfec4 00000000 0746fff0 shell32!CShellExecute::CreateParsingBindCtx+0x1d6
093dfecc 755224da 00000000 0746fff0 00000000 shell32!CShellExecute::ParseOrValidateTargetIdList+0x37
093dfef0 7551fd5a 093dff80 768b983a 07604f68 shell32!CShellExecute::_DoExecute+0x40
093dfef8 768b983a 07604f68 768b9770 768b9770 shell32!<lambda_e76b82c5cb7f9f82cbe0fd97ad5190bf>::<lambda_invoker_stdcall>+0x1a
093dff80 73d08484 0019fd94 73d08460 21439000 shcore!_WrapperThreadProc+0xca
093dff94 772c2fea 0019fd94 25ae5778 00000000 KERNEL32!BaseThreadInitThunk+0x24
093dffdc 772c2fba ffffffff 772dec22 00000000 ntdll!__RtlUserThreadStart+0x2f
093dffec 00000000 768b9770 0019fd94 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: .cxr 0x0 ; kb
SYMBOL_STACK_INDEX: 1
SYMBOL_NAME: shell32!GetUrlSchemeW+28
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: shell32
IMAGE_NAME: shell32.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 0
FAILURE_BUCKET_ID: INVALID_POINTER_READ_c0000005_shell32.dll!GetUrlSchemeW
BUCKET_ID:
APPLICATION_FAULT_INVALID_POINTER_READ_shell32!GetUrlSchemeW+28
ANALYSIS_SOURCE: UM
FAILURE_ID_HASH_STRING: um:invalid_pointer_read_c0000005_shell32.dll!geturlschemew
FAILURE_ID_HASH: {89d9bcf0-5ef6-4e90-df6b-f05dc028e062}
Followup: MachineOwner
---------
最佳答案
正如@RaymondChen 所说,这是 Windows 10 中的一个错误。
Raymond 过于谦虚,无法接受名声;所以我把他的回答当作我自己的回答。
关于winapi - Application Verifier 在调用 ShellExecuteEx 时报告访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50861106/
一个非常简单的问题,如果我创建一个 HANDLE在 app1.exe 中,它得到值 0x01这个值是全局唯一的吗? 或者当其他一些进程创建一个 HANDLE 时是否有可能?也有值(value) 0x0
我正在使用winapi-rs crate并尝试获取cpu的使用率,但是我什至无法做到这一点。 PdhCollectQueryData转换为十六进制时将返回“-2147481643”,然后错误代码为“0
有人可以告诉我,在 winapi 中将进度条作为 TreeView 控件的一部分是否现实?我使用 GTK 制作了一个 GUI,并且使用进度条作为单元格元素效果很好,如下图所示。 我没有开发自定义控件的
有 getaddrinfo() 用于阻止主机解析,但是否有非阻塞方法? 最佳答案 我不认为有这样的事情,但你总是可以将它包装在一个线程中并使用信号量来表示完成。 关于winapi - 在 WINAPI
如果我知道 Hwnd,如何获取正在运行的应用程序的图标? 最佳答案 如果你有窗口的句柄,你可以使用 GetClassLong : HICON icon = (HICON)GetClassLong(wi
我正在尝试阅读 IMAGE_DOS_HEADER使用 definition of that structure 的模块来自 winapi箱。 这是我的工作代码: let mut IDH: IMAGE_
我目前正在阅读MSDN的文档,以将流渲染到音频渲染器。 换句话说,就是从麦克风播放我捕获的数据。 http://msdn.microsoft.com/en-us/library/dd316756%28
我有一个问题,希望你能帮我解决。已经没有我的研究运气了...尝试过 stackoverflow、google,甚至 yahoo... 如何在不使用鼠标的情况下强制显示工具提示? 我目前正在实现一些窗口
在 D 中,每次启动应用程序时,我的垃圾收集器都会崩溃。 Windows 模块: pragma(lib, "user32.lib"); import std.string; extern(Window
我正在学习 WinAPI C++ 的绘图形状 我试图在 WM_PAINT 上用一些代码绘制 2 个椭圆: PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps)
我使用 PostMessage 模拟鼠标事件并在记事本应用程序上进行了测试。 我不想通过发送鼠标事件来获得记事本应用程序的焦点。 仅当我在 PostMessage 参数中使用记事本的 ChildWin
如何使用 Win32 WinAPI 创建一个 EditBox,使其看起来像在 Visual C# 或 VB 中的 VS 设计器中放置一个编辑框(具有漂亮的顶部边框等)?这是一张图片,展示了它的外观以及
有CopyRect WinAPI function ,它只是复制一个 RECT到另一个。 自从我挖掘它以来,我一直对这个函数存在的原因很感兴趣。 是赋值运算符 ( = ) 还是 CopyMemory功
只是想知道是否有一种方法可以将数字打印到控制台通过调用。它可以是 10 进制,也可以是十六进制,我不介意。 我想看看一些函数返回的格式。 我宁愿不使用 WriteConsole 和大量 asm 来做这
这似乎部分有效,但我无法获取要打印的字符串值 pub fn test() { let mut buf: Vec = vec![0; 64]; let mut sz: DWORD = 0
在 Excel 中使用 Visual Basic,我可以使用 DECLARE 关键字声明 WinAPI 函数 - 例如 Declare Function SetLocaleInfo Lib "kern
..嗨,我有这个代码: #[cfg(windows)] extern crate winapi; use winapi::um::winuser::{FindWindowW, GetClientRec
我有一个 WH_CALLWNDPROC Hook 代码,它处理 WM_INITDIALOG 消息以获取有关消息框的信息。我可以获得“消息”、“标题”、“按钮”,但无法获得“图标”信息。我正在尝试使用如
这是我的源代码: extern crate user32; extern crate kernel32; use std::io::prelude::*; use std::net::TcpStrea
WinAPI OpenFile 函数返回 HFILE,例如 GetFileTime 需要 HANDLE。当我用 (HANDLE)some_hFile 喂它时,它似乎工作正常。这种类型有什么不同吗,或者
我是一名优秀的程序员,十分优秀!