对于 64 位应用程序,.NET 使用 WSAStartup 是否安全?

2024-01-01

对于 64 位应用程序,.NET Framework 版本和 WSAData 结构的本机 Win32 版本之间不匹配,因为字段的顺序不同。我已经复制了 .NET 版本以用于我们基于 C# 的产品,但一位同事担心我造成了内存损坏。使用 DllImport / PInvoke 时是否会因为这种不匹配而导致内存损坏?将本机版本编组到托管版本时是否存在无效内存访问的风险?假设我不关心实际访问生成的 WSAData 对象的字段。我只是想确定我对 WSAStartup 的调用不会损坏内存或使应用程序崩溃。

这是 WinSock2.h 中的本机 C++ 版本。请注意,64 位和 32 位中成员的顺序不同。 WSADESCRIPTION_LEN 为 256,WSASYS_STATUS_LEN 为 128。

typedef struct WSAData {
        WORD                    wVersion;
        WORD                    wHighVersion;
#ifdef _WIN64
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
#else
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;

这里是.NET Framework 中的托管版本 http://referencesource.microsoft.com/#System/net/System/Net/_OSSOCK.cs,815285a476c6ee34,references:

[StructLayout(LayoutKind.Sequential)]
internal struct WSAData {
    internal short wVersion;
    internal short wHighVersion;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=257)]
    internal string szDescription;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=129)]
    internal string szSystemStatus;
    internal short iMaxSockets;
    internal short iMaxUdpDg;
    internal IntPtr lpVendorInfo;
}

[DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false,
    ThrowOnUnmappableChar=true, SetLastError=true)]
internal static extern SocketError WSAStartup(
    [In] short wVersionRequested,
    [Out] out WSAData lpWSAData
                                               );

当然,这是不正确的。 .NET Framework 摆脱了它,结构大小仍然正确(32 位模式下为 400 字节,64 位模式下为 408),因此不会发生内存损坏。而且它实际上并没有使用任何返回的信息,如果他们这样做的话肯定会发现这个错误。

您可以在 connect.microsoft.com 上提交该错误,但我怀疑他们是否会急于修复它。

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

对于 64 位应用程序,.NET 使用 WSAStartup 是否安全? 的相关文章

  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 在 Windows CE 6.0 与 Windows Mobile 6.1 下进行开发的权衡是什么

    我有一个 Windows NET 应用程序 我计划将其 移植 并定制为移动设备 该应用程序由一个独立的 NET 程序组成 该程序与条形码扫描仪配合使用 具有简单的 UI 并将扫描结果记录到文件中 还有一个 Windows 服务 可以使用 W
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • Android Chronometer 从定义的值开始

    我有一个应用程序 在其中向用户显示他正在做的事情的计时器 每当活动进入后台 无论是通过主页按钮还是返回 时 我都会保存该时间 以秒为单位 当活动返回时 我想继续从同一时间运行计时器 用户可能会从列表中选择不同的项目 时间也会不同 而且他可能
  • 使用arduinoEDK通过esp8266调用nest api

    我正在尝试使用 ESP8266 和 Arduino EDK 连接到 Nest API 恒温器 但至今还没有结果 我以前见过有人在这里问过同样的问题 但他的问题的答案对我没有帮助 这是我的代码 Code include
  • Java 连接池最佳实践?

    在厌倦了 c3p0 的持续锁定后 我转向 BoneCP 为我的数据库寻找替代连接池 我有一个服务器应用程序 每分钟处理大约 7 000 个项目 并且需要将这些项目记录到我们的 MySQL 数据库中 我目前有 100 个工作线程 并像这样设置
  • 如何从 CI/CD 管道监控 adf 管道

    我有一个 CD 管道 它会触发 azure 数据工厂 adf 管道 但它 CD 管道 不会等到 adf 管道完成才继续执行下一个任务 我想知道 CD 管道中是否有任何内置功能 我可以通过它们触发和监视 adf 管道 因此 我期望的结果是 C
  • 如何在 gettext .po 文件中指定有序变量?

    我有一个多语言站点 它使用 Zend Translate PHP 数组来处理翻译 它工作正常 但我正在尝试转换为使用 gettext 因为它提供了额外的功能 然而 我还没有发现 gettext 相当于我在 PHP 数组翻译中喜欢的功能 n
  • Chart.js v2.6:向饼图输出值添加箭头

    我正在使用 Chart js v2 6 输出饼图 数据是从MySQL数据库中获取的 图表渲染正确 但我需要向数据值添加箭头 如下面的屏幕截图所示 带箭头的饼图示例 下面是我使用 Chart js 输出饼图的代码 var chartdata
  • java 打印一个三角形

    我正在尝试制作一个程序 该程序接受用户输入 例如三角形应该有多长及其方向 我遇到的问题是 在我运行程序后 它不断向程序添加更多数字 例如 State the length of the two sides finish with 1 5 S
  • 将 Microsoft.AspNet.Identity 升级到 rc1 后找不到 IdentityStoreManager

    将 Microsoft AspNet Identity Core 升级到 1 0 0 rc1 后 由 Visual Studio 2013 中的默认 MVC5 模板生成的 AccountController cs 和 AppModel cs
  • HTML5 是一种编程语言吗?

    如今 我们可以使用 HTML5 来制作应用程序 例如在 android firefox 操作系统 iPhone 黑莓等中 但是 我听说HTML是一种标记语言 不是用于编程的 即使有了应用程序功能 HTML 仍然是only标记语言 编程语言具
  • 使用架构组件导航从单个活动传递数据以启动目标片段

    我有以下内容Activity 这是我的应用程序中的唯一一个 MainActivity java public class MainActivity extends AppCompatActivity Override protected v
  • .NET 7/8 如何使用 Minimap API 提供组的描述/摘要?

    我添加了一组最小的 API 如下所示 var myapi app MapGroup myapi WithTags My API WithOpenApi and then myapi MapGet GetAllStuff WithName G
  • Oracle/SQL - 合并来自“不相关”不相关表的计数

    假设我有两张桌子GOOD and BAD存储小部件生产的记录 我的桌子看起来像这样 Widget Good Widget A Y Widget A Y Widget B Y Widget Bad Widget A Y Widget B Y
  • 您是否必须取消订阅组件中的 QueryList?

    当使用 ContentChildren or ViewChildren用于监听 DOM 元素更改的装饰器 我是否必须取消订阅QueryList 例如 Component export class ParentComponent implem
  • 在wpf中动态添加列到DataGrid

    我目前正在处理自定义画布 并且必须添加一个表格 所以我认为 dataGrid 就可以了 所以我想创建一个 Table from 数据网格 用户可以通过它在运行时将表格添加到画布 到目前为止 我已经尝试使用列表填充 DataGrid 并成功了
  • 有效地重新格式化数据布局

    我有几个 Excel 电子表格 其数据布局如下raw data https i stack imgur com QOju9 jpg company company1 company2 company3 currency Y E 1 1 20
  • Java 中的 Byte 和 Short 的要点(我已阅读其他问题)

    我的问题是 如果我从 Java 反汇编中得到它 当我使用 byte a 3 b 5 System out println a b 实际上会使用 int 而不是 byte 此外 所有本地内存插槽都是 4B 就像堆栈插槽一样 我意识到分配一个字
  • 为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢?

    我正在实现角度 材料树组件并遇到一些问题 保存对树的更改后 我正在重置支持树的数据 有效 但是应用程序变得非常慢 扩展节点可能需要大约 8 秒 更奇怪的是 实际操作数据源的代码是在其他地方运行的 例如向树中添加新的子项 我们希望 UI 更新
  • 在 iOS 上显示按比例间隔的数字(而不是等宽/表格)

    我在 iOS 中渲染数字 目标为 7 及以上 方法是将它们存储在 NSAttributedString 中并使用 drawAtPoint 进行渲染 我正在使用 Helvetica Neue 我注意到这样画出的数字的位数不成比例 字形都具有相
  • 在 Kivy 中将图像对象作为按钮背景传递

    在Kivy中 有没有办法将图像对象作为按钮背景而不是图像文件名传递 button background normal属性仅接受字符串 我想自定义图像属性 例如allow stretch False 如果成功 我如何指定按钮内的图像对齐方式
  • 对于 64 位应用程序,.NET 使用 WSAStartup 是否安全?

    对于 64 位应用程序 NET Framework 版本和 WSAData 结构的本机 Win32 版本之间不匹配 因为字段的顺序不同 我已经复制了 NET 版本以用于我们基于 C 的产品 但一位同事担心我造成了内存损坏 使用 DllImp