Marshal.StructureToPtr 在模块 ntdll.dll 中失败

2024-01-05

我将从一点历史:我目前面临的问题是突然出现的,没有对代码进行任何更改。 3天后又以同样的方式消失。现在它一周后就回来了并且不想消失=)。

I have 适用于打印机的代码- 设置打印机首选项以指定方式打印文档。我使用本地打印机,它指向网络打印机的 TCP 地址(据我所知,这是执行此类任务的常见方法)。

下面是我用来从二进制文件加载打印机配置的代码(之前以类似的方式保存)。我为所有源代码提供了非托管函数调用的声明,因为不知道是什么会导致问题。制动我的应用程序的线路(Windows 服务):

Marshal.StructureToPtr(pInfo, pPInfo, true); //THIS LINE FAILS

这是函数的完整代码:

public static bool LoadSettings(string printerName, string filepath)
{
    Logger.GetLog().WriteInformation(string.Format("Loading printer settings '{0}' for printer '{1}'", filepath, printerName), "PrinterSettingsStorage.LoadSettings()");
    bool success = false;
    try
    {
        if (!File.Exists(filepath))
        {
            return false;
        }

        IntPtr hPrinter;
        int bytes = 0;
        IntPtr pPInfo;
        IntPtr pDevMode;
        PRINTER_INFO_2 pInfo = new PRINTER_INFO_2();

        PRINTER_DEFAULTS PrinterValues = new PRINTER_DEFAULTS();
        PrinterValues.pDatatype = 0;
        PrinterValues.pDevMode = 0;
        PrinterValues.DesiredAccess = PRINTER_ALL_ACCESS;

        //retrieve the devmode from file
        using (FileStream fs = new FileStream(filepath, FileMode.Open))
        {
            int length = Convert.ToInt32(fs.Length);
            pDevMode = GlobalAlloc(0, length);
            for (int i = 0; i < length; i++)
            {
                Marshal.WriteByte(pDevMode, i, (byte)fs.ReadByte());
            }
        }

        //get printer handle
        OpenPrinter(printerName, out hPrinter, ref PrinterValues);

        //get bytes for printer info structure and allocate memory
        GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out bytes);
        if (bytes == 0)
        {
            throw new Exception("Get Printer Failed");
        }
        pPInfo = GlobalAlloc(0, bytes);

        //set pointer to printer info
        GetPrinter(hPrinter, 2, pPInfo, bytes, out bytes);

        //place the printer info structure
        pInfo = (PRINTER_INFO_2)Marshal.PtrToStructure(pPInfo, typeof(PRINTER_INFO_2));

        //insert the new devmode
        pInfo.pDevMode = pDevMode;
        pInfo.pSecurityDescriptor = IntPtr.Zero;

        //set pointer to new printer info
        Marshal.StructureToPtr(pInfo, pPInfo, true); //THIS LINE FAILS

        //update
        SetPrinter(hPrinter, 2, pPInfo, 0);

        //free resources
        GlobalFree(pPInfo);
        GlobalFree(pDevMode);
        ClosePrinter(hPrinter);

        success = true;
    }
    catch (COMException ce)
    {
        Logger.GetLog().WriteError(string.Format("COM error loading printer settings to printer: {0}", Marshal.GetLastWin32Error()), ce.StackTrace, "PrinterSettingsStorage.LoadSettings()");
    }
    catch (Exception e)
    {
        Logger.GetLog().WriteError(string.Format("Unknown error loading printer settings to printer"), e.StackTrace, "PrinterSettingsStorage.LoadSettings()");
    }
    finally
    {
        Logger.GetLog().WriteInformation(string.Format("Finish loading printer settings '{0}' for printer '{1}'. Success: {2}", printerName, filepath, success), "PrinterSettingsStorage.LoadSettings()");
    }
    return success;
}

[StructLayout(LayoutKind.Sequential)]
internal struct PRINTER_DEFAULTS
{
    public int pDatatype;
    public int pDevMode;
    public int DesiredAccess;
}

[StructLayout(LayoutKind.Sequential)]
internal struct PRINTER_INFO_2
{
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pServerName;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pPrinterName;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pShareName;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pPortName;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pDriverName;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pComment;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pLocation;
    public IntPtr pDevMode;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pSepFile;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pPrintProcessor;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pDatatype;
    [MarshalAs(UnmanagedType.LPStr)]
    public readonly string pParameters;
    public IntPtr pSecurityDescriptor;
    public readonly Int32 Attributes;
    public readonly Int32 Priority;
    public readonly Int32 DefaultPriority;
    public readonly Int32 StartTime;
    public readonly Int32 UntilTime;
    public readonly Int32 Status;
    public readonly Int32 cJobs;
    public readonly Int32 AveragePPM;
}

[DllImport("kernel32.dll", ExactSpelling = true)]
private static extern IntPtr GlobalFree(IntPtr handle);

[DllImport("winspool.Drv", EntryPoint = "GetPrinterA", SetLastError = true,
    CharSet = CharSet.Ansi, ExactSpelling = true,
    CallingConvention = CallingConvention.StdCall)]
private static extern bool GetPrinter(IntPtr hPrinter, Int32 dwLevel,
                                        IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded);

[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA",
    SetLastError = true, CharSet = CharSet.Ansi,
    ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool
    OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter,
                out IntPtr hPrinter, ref PRINTER_DEFAULTS pd);

[DllImport("winspool.drv", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern bool SetPrinter(IntPtr hPrinter, int Level, IntPtr pPrinter, int Command);

[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true,
    ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool ClosePrinter(IntPtr hPrinter);

症状:

  • 服务只是在参考线路退出时立即停止。没有finally块执行,没有捕获异常。

  • Windows 事件日志包含错误

    错误模块名称:ntdll.dll,版本:6.1.7601.17725,时间戳:0x4ec49b8f 异常代码:0xc0000374 故障偏移:0x000ce6c3 故障进程 ID:0x12dc 错误的应用程序启动时间:0x01cdc71b9bf9b661 错误应用程序路径: C:\Program Files (x86)\MyServiceExePath.exe 错误模块路径: C:\Windows\SysWOW64\ntdll.dll 报告 ID:0eb45111-330f-11e2-be8e-005056975a30

我的操作系统:Windows Server 2008 R2。

正如我所说,它会在一段时间内不断重现,然后在代码没有任何更改的情况下消失一次。我不知道是什么原因导致这个问题以及为什么它如此不稳定。希望这里有人比我对非托管代码更有经验=)。

有任何想法吗?


        //insert the new devmode
        pInfo.pDevMode = pDevMode;
        pInfo.pSecurityDescriptor = IntPtr.Zero;

        //Add by me
        Marshal.StructureToPtr(pInfo, pPInfo, false);
        //set pointer to new printer info 
        Marshal.StructureToPtr(pInfo, pPInfo, true);

        //update
        SetPrinter(hPrinter, 2, pPInfo, 0);
        //Add by me
        Marshal.DestroyStructure(pPInfo, typeof(PRINTER_INFO_2));

        //free resources
        GlobalFree(pPInfo);
        GlobalFree(pDevMode);
        ClosePrinter(hPrinter);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Marshal.StructureToPtr 在模块 ntdll.dll 中失败 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 从 C# 应用程序中的配置文件检索值不起作用

    当我尝试使用配置文件时遇到问题 我在这里和其他地方读过一些帖子 但工作上的问题却解决不了 在我的问题中 我添加了配置
  • 元素矩阵乘法:R 与 Rcpp(如何加速此代码?)

    我是新来的C 编程 使用Rcpp无缝集成到R 并且我希望得到一些有关如何加快某些计算速度的建议 考虑以下示例 testmat lt matrix 1 9 nrow 3 testvec lt 1 3 testmat testvec 1 2 3
  • CryptographicException:密钥在指定状态下使用无效

    我是 C 新手 我不明白为什么它会产生问题 CspParameters cspParams new CspParameters 24 cspParams KeyContainerName XML DISG RSA KEY RSACrypto
  • 出现错误:连接 ECONNREFUSED 127.0.0.1:3306

    我是 Node js 的初学者 正在学习有关如何为 Android 设置 Node js 服务器的教程 当我执行这个命令时 nodemon app js我收到这个错误 nodemon 1 19 0 nodemon to restart at
  • 相当于 Clojure 函数的 Java toString()

    我正在使用一些 Java 代码调用toString 在我的 Clojure 函数对象上 它返回类似的内容
  • 为什么在 Weblogic 集群中使用单播与组播

    从文档中并不清楚为什么应该在 WebLogic 集群中使用单播而不是多播 有人有使用这两者的经验以及迁移到 Unicast 的好处吗 单播和组播的主要区别如下 Unicast 假设集群中有三台服务器 MS 1 MS 2 MS 3 如果它们必
  • 如何跟踪 Node.js 中的(更改的)日志文件

    好吧 这似乎是一个简单的问题 但我无法从这里找到答案 因此我将其发布 希望有人可能遇到类似的问题 我需要监视指向 Web 服务器文件的符号链接 var log lighttpd error log更具体地说 感谢莱纳斯 G 蒂尔 https
  • WebElement.getCssValue 和 WebElement.getAttribute 用法

    任何人都可以帮助我了解如何使用这两个函数来获取任何 CSS 属性的值 如果有一个特定的 img 标签如下 img title Title alt myTitle src A B C xyz png driver getElement By
  • 在 QT 项目中使用 Crypto++ 静态库

    我已经在我的系统上静态构建了 cryptopp 它也通过了所有测试 这些是我在测试期间收到的警告 WARNING CRYPTOPP NO UNALIGNED DATA ACCESS is not defined in config h WA
  • 如何使用 Chrome 的调试器协议从时间戳导出 walltime?

    我一直在构建一个 Chrome 扩展程序 部分使用Chrome 调试器协议 https chromedevtools github io debugger protocol viewer 中的某些事件网络域 https chromedevt
  • 在 Xcode 中构建时添加变量

    我有一些动态值需要根据我在 Xcode 中进行的构建类型进行更改 我创建了2个方案DEV and PROD并在每个中设置环境变量 然后我在代码中使用它们 如下所示 var serviceDomain String let envVar Pr
  • 什么时候应该使用Task.Run()而不是await?

    我正在存储数据模型的状态 我克隆数据模型 然后希望将其异步写入 磁盘 我应该使用 Task Run 在后台线程上运行它吗 或者我应该将其设为异步函数而不是等待它 这将使其在 UI 线程上运行 与此类似 但我的问题有点不同 异步任务 使用 M
  • Android 使元素仅出现在纵向视图中

    我有一个支持广告的应用程序 因此 当屏幕旋转时 广告仍然存在 我希望能够使广告仅在手机处于纵向而不是横向时存在 我是否需要声明一个单独的景观 xml 或者是否有其他方法可以做到这一点 如果我需要声明一个横向 xml 我该如何在 java 中
  • C# 中的队列实现

    我正在处理一次只能处理 1 个命令的硬件资源 我将通过 Web 界面公开它的一些 API 函数 因此显然一次很有可能发送超过 1 个命令 我决定在提交这些命令时对其进行排队是确保串行处理的最佳方法 我计划在静态类中实现队列 Web 应用程序
  • Intellij Idea 日志 GradleConnectionException:构建时无法使用 Gradle 安装执行构建

    我使用 Intellij Idea 13 1 1 在构建时遇到 GradleConnectionException Error org gradle tooling GradleConnectionException Could not e
  • pty 和 tty 是什么意思?

    我注意到很多提到pty and tty在一些开源项目中 有人可以告诉我它们是什么意思以及它们之间有什么区别吗 tty原本的意思是 电传打字机 and pty means 伪电传打字机 在 UNIX 中 dev tty 是任何像 电传打字机
  • 为什么迭代 std::array 比迭代 std::vector 快得多?

    编者注 启用优化的后续问题仅对循环进行计时 为什么迭代 std vector 比迭代 std array 更快 https stackoverflow com questions 57125253 why is iterating thou
  • CSS 列表项宽度/高度不起作用

    我尝试制作一个导航内联列表 你可以在这里找到它 http www luukratief design nl dump parallax para html http www luukratief design nl dump paralla
  • 如何在 Vim 中将每行的前两个大写字符更改为小写?

    我有以下文字 HELLO TO STACKOVERFLOW WELCOME TO STACKOVERFLOW 我希望将文本更改如下 heLLO TO STACKOVERFLOW weLCOME TO STACKOVERFLOW 我怎样才能在
  • Marshal.StructureToPtr 在模块 ntdll.dll 中失败

    我将从一点历史 我目前面临的问题是突然出现的 没有对代码进行任何更改 3天后又以同样的方式消失 现在它一周后就回来了并且不想消失 I have 适用于打印机的代码 设置打印机首选项以指定方式打印文档 我使用本地打印机 它指向网络打印机的 T