urlmon.dll引起的“尝试读取或写入受保护的内存”

全部

我知道这个问题已经被问过很多次了,但是不幸的是我没有找到解决问题的方法,我一直urlmon.dll在从字节数组中查找MIME类型,但是IIS进程却导致崩溃w3wp.exe

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

代码:

public static int MimeSampleSize = 256;

public static string DefaultMimeType = "application/octet-stream";

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static uint FindMimeFromData(
    uint pBC,
    [MarshalAs(UnmanagedType.LPStr)] string pwzUrl,
    [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
    uint cbSize,
    [MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed,
    uint dwMimeFlags,
    out uint ppwzMimeOut,
    uint dwReserverd
);

public static string GetMimeFromBytes(byte[] data)
{
    try
    {
        uint mimeType;
        FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);

        var mimePointer = new IntPtr(mimeType);
        var mime = Marshal.PtrToStringUni(mimePointer); // <-- Crash happens here
        Marshal.FreeCoTaskMem(mimePointer);

        return mime ?? DefaultMimeType;
    }
    catch
    {
        return DefaultMimeType;
    }
}

崩溃直接发生在以下行中:

var mime = Marshal.PtrToStringUni(mimePointer);

我尝试取消选中“ Suppress JIT optimization on module load”选项,但没有运气。还尝试将构建更改为x86而不是任何CPU,但没有任何运气。

注意:我使用的是4.5框架,IIS 8

r15

我认为问题是FindMimeFromData()的签名。在此处查看PInvoke.net,以获取功能的正确签名:

http://www.pinvoke.net/default.aspx/urlmon/findmimefromdata.html

..so而不是pBC和ppwzMimeOut的uint,您将需要IntPtr!

也可以看看:

urlmon.dll FindMimeFromData()在64位桌面/控制台上完美运行,但在ASP.NET上生成错误

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试读取或写入受保护的内存

使用反射调用dll函数时尝试读取或写入受保护的内存

P调用“尝试读取或写入受保护的内存”

SQL-尝试读取或写入受保护的内存

尝试读取或写入受保护的内存。这通常表明其他内存已损坏

尝试读取或写入受保护的内存:C ++的内存修改值

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

OpenTK:尝试读取或写入受保护的内存。这通常表明其他内存已损坏

并行读取AutoCad数据库时出现“尝试读取或写入受保护的内存”错误

应用程序池在 MIME 类型检查期间因 URLMoniker urlmon.dll 崩溃

的OpenGL / OpenTK绘图与指数:尝试读取或写入受保护的内存问题

尝试读取或写入受保护的内存的平台调用错误

使用线程池限制最大线程数-尝试读取或写入受保护的内存错误

通过DllImport在C#中调用C方法-尝试读取或写入受保护的内存

尝试读取或写入受保护的内存.....在Silverlight Windows Phone 8.1项目中

打开SQL Server连接的原因:System.AccessViolationException尝试读取或写入受保护的内存

VB.NET访问-尝试读取或写入受保护的内存

添加单例Kafka生产者:尝试读取或写入受保护的内存

未处理的异常:System.AccessViolationException:尝试读取或写入受保护的内存

c# emgu/opencv 用法抛出异常 - 尝试读取或写入受保护的内存

尝试下载带有 urlmon.dll 的文件时如何修复“运行时检查失败 #0”错误?

c dll 在 vb6 上工作正常,但在 vb.net 上出错(尝试读取或写入受保护的内存)

附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏

PInvoke ReadFile kernel32:尝试读取或写入受保护的内存。这通常表明其他内存已损坏

启动MvvmCross Uwp应用程序时发生异常:“ System.AccessViolationException:尝试读取或写入受保护的内存”

尝试读取或写入受保护的内存。这通常表明其他内存已损坏,同时使用 C# 读取 CSV 文件

尝试使用GetClassName读取或写入受保护的内存

urlmon.h 中的“ProcessName”未声明标识符

写入/读取受内存保护的进程的内存