CreateProcess 和奇怪的 nslookup 错误

2024-01-18

我有一个经常使用的 api 例程来捕获 dos 输出。最近发现了一个奇怪的错误,它似乎不允许 dns 调用。例如 nslookup 将返回“服务器无响应”错误,服务器:未知。如果您向其提供 IP 地址,Ping 将起作用,但如果它必须进行 dns 调用,则 Ping 不起作用。这个问题与这段代码完全隔离。

任何对此问题的见解将不胜感激。 Winapi 不是我最擅长的领域。

编辑:很抱歉添加了所有常量和类型,但我将其制作成可以粘贴到模块中并运行以自行测试的内容,以使问题更容易解决。

' STARTUPINFO flags
Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESTDHANDLES = &H100

' ShowWindow flag
Private Const SW_HIDE = 0

'CreatePipe buffer size
Private Const BUFSIZE = 1024

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Type STARTUPINFO
    cb As Long
    lpReserved As Long
    lpDesktop As Long
    lpTitle As Long
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function CreatePipe Lib "kernel32.dll" (ByRef phReadPipe As Long, ByRef phWritePipe As Long, ByRef lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByRef lpEnvironment As Any, ByVal lpCurrentDriectory As String, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Sub GetStartupInfo Lib "kernel32.dll" Alias "GetStartupInfoA" (ByRef lpStartupInfo As STARTUPINFO)
Private Declare Function PeekNamedPipe Lib "kernel32.dll" (ByVal hNamedPipe As Long, ByRef lpBuffer As Any, ByVal nBufferSize As Long, ByRef lpBytesRead As Long, ByRef lpTotalBytesAvail As Long, ByRef lpBytesLeftThisMessage As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long

Sub CreateprocessApiTest()
    On Error GoTo errHandler
    Dim pa As SECURITY_ATTRIBUTES
    Dim pra As SECURITY_ATTRIBUTES
    Dim tra As SECURITY_ATTRIBUTES
    Dim si As STARTUPINFO
    Dim pi As PROCESS_INFORMATION
    Dim retVal As Long
    Dim command As String
    Dim ErrorDesc As String
    Dim hRead As Long     ' stdout + stderr
    Dim hWrite As Long
    Dim bAvail As Long    ' pipe bytes available (PeekNamedPipe)
    Dim bRead As Long     ' pipe bytes fetched   (ReadFile)
    Dim bString As String    ' our buffer
    Dim s As String

    command = "nslookup google.com"

    pa.nLength = Len(pa)
    pa.bInheritHandle = 1

    pra.nLength = Len(pra)
    tra.nLength = Len(tra)

    retVal = CreatePipe(hRead, hWrite, pa, BUFSIZE)

    With si
        .cb = Len(si)
        GetStartupInfo si
        .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
        .wShowWindow = SW_HIDE
        .hStdOutput = hWrite
        .hStdError = hWrite
    End With

    retVal = CreateProcess(vbNullString, command, pra, tra, 1, 0&, 0&, vbNullString, si, pi)

    Do While PeekNamedPipe(hRead, ByVal 0, 0, ByVal 0, bAvail, ByVal 0)
        DoEvents
        If bAvail Then
            bString = String(bAvail, 0)
            ReadFile hRead, bString, bAvail, bRead, ByVal 0&
            bString = Left(bString, bRead)
            s = s & bString
            CloseHandle hWrite
        End If
    Loop
    CloseHandle hRead
    CloseHandle pi.hThread
    CloseHandle pi.hProcess

    MsgBox s

exitRoutine:
    Exit Sub
errHandler:
    Debug.Print Err.Number, Err.Description
    Resume exitRoutine
End Sub

Wrong lpEnvironment As Any范围。添加ByVal像这样

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

CreateProcess 和奇怪的 nslookup 错误 的相关文章

  • 如何在没有io的情况下在windows上创建特定大小的文件?

    Windows 上是否有与 posix fallocate 等效的函数 具体来说 我正在寻找一种方法来立即 无需执行大量 IO 创建特定大小的文件 我不关心内容 我尝试过 chsize s 它确实分配了文件 但需要很长时间 如果我右键单击文
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • 链接到大地址感知 DLL

    假设我有一个使用 LARGEADDRESSAWARE 链接器标志集构建的 DLL 现在我有一个动态链接到该 DLL 的应用程序 这是否会使我的应用程序具有大型地址意识 如果不是 那么为任何 DLL 设置此标志是否有意义 讨论here htt
  • 在 C++ 程序中多次使用 FindWindows?

    我使用以下代码 C 来获取窗口 另一个应用程序 的句柄并向其中一个按钮发送消息以模拟单击 并且它可以正常工作 BOOL CALLBACK EnumChildProc HWND hwnd LPARAM lParam mdv test list
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?

    我正在寻找一个类名称为 CLIPBRDWNDCLASS 的窗口 它可以在办公应用程序和其他应用程序中找到 如果我使用 FindWindow 或 FindWindowEx 我找到第一个具有此类的 HWND 但我想要all具有该类的窗口 因此我
  • Windows 上的 wchar_t 和 char16_t 是一样的吗?

    我有一个实例std u16string 我可以通过它吗c str 到一个 Win32 API 它期望LPCWSTR 没有任何类型的转换 例如 我可以安全地这样做吗 auto u16s std u16string u Hello SetWin
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 如何在 WINAPI 中获取 Windows 10 内部版本、修订号?

    我想使用 WINAPI 在 Windows 10 上获取构建版本 当前窗口版本 10 0 19042 685 我尝试使用 WMI 查询来获取它 select Version BuildNumber from Win32 OperatingS
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • Win32 自定义绘制树视图控件

    我正在尝试使用 NM CUSTOMDRAW 消息自定义树视图控件 我只是想用灰色绘制所有其他可见的项目 这是绘制的代码 INT CResourceOutliner On WM NOTIFY HWND hDlg WPARAM wParam L
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 如何为 C++ Visual Studio 2019 指定应用程序图标?

    我见过本文档 https learn microsoft com en us visualstudio ide how to specify an application icon visual basic csharp view vs 2
  • 如何使用 Python 与窗口的 GUI 交互?

    假设您想打开myapp exe 打开第三个菜单 然后选择第二个菜单项 即像用户使用键盘或鼠标一样 然后在对话框窗口中选择第二个按钮 pyahk https pyahk readthedocs io en latest and pyautog
  • 使用 BitBlt 捕获程序窗口始终返回相同的图像

    我编写了以下代码 C Win32 来捕获游戏窗口屏幕并从图像中获取像素颜色数组 函数 autoB 完成这项工作 然后我将结果数组绘制到窗口中以直观地检查我得到的结果 问题是 这个程序在我启动计算机后只工作一次 在第一次 缓存 从游戏中获取的
  • C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

    我正在尝试编写一个小程序 该程序作为服务运行并监视用户是否处于活动状态 如果用户空闲 没有鼠标 键盘 一个小时 则某些进程将被终止 如果用户使用 user32 dll 中的 LASTINPUTINFO 运行它 它就可以工作 但它不能作为服务
  • 如何让 Win32 使用 Windows XP 样式字体

    我正在使用纯 C 和 WinAPI 编写 Win32 应用程序 不允许使用 MFC 或 C 为了让控件使用适当的样式进行绘制 我使用了清单 如相应的 MSDN 文章中所述 一切都很好 当我更改系统样式时 我的应用程序也会更改样式 但使用的字
  • 如何在Delphi中显示Vista风格的气球提示?

    在输入验证时 我使用气球提示而不是消息框 我的问题是 在 Vista 上 它们具有带圆角的旧 XP 样式 而不是较新的矩形外观 我尝试使用 CreateWindowEx 创建它们并且tooltips class32或使用 SendMessa

随机推荐

  • Web.config URL 重写 - HTTPS 和非 WWW

    我需要两者兼而有之https and non www重写 同时也不对域进行硬编码 因为我们有很多服务器 这需要在web config 不在IIS 我读过很多文章 http www iis net learn extensions url r
  • 如何使用 Javascript 将查询参数附加到我的 URL?

    我正在构建一个 Web 应用程序 并使用 Firebase 将用户数据存储在 Cloud Firestore 中 我的网络应用程序上有一个页面 允许用户从 Cloud Firestore 查看他们的文档 我想在我的 URL 末尾添加一个查询
  • Wamp 图标为绿色,但点击时没有反应

    我面临的问题是 我新安装的 WAMP 3 0 正在运行 图标为绿色 apache 和 MYSQL 已启动并运行 本地主机页面可访问 但如果我单击 WAMP 图标来更改任何设置 图标没有反应根本不 鼠标左键或右键单击均不起作用 即使我想关闭
  • Backbone.js 在视图中获取渲染回调

    我有一个 Backbone 应用程序 我们有这样的东西 render function this el html template id plugin return this The id来自正在渲染的元素 这仅有时有效 因为它实际插入到
  • 注销后无法使用 Facebook 凭据登录

    我有一个 Android 应用程序 允许用户使用 Facebook 凭据登录 一旦他们第一次注销 他们就无法再次登录 清除应用程序的权限后用户设置中的应用程序页面 https www facebook com settings tab ap
  • FromHeader Asp.NET Core 绑定到默认值

    我正在使用以下基本控制器测试 Asp Net core WebApi Route test public class TestController Route mult HttpGet public int Multiply int x i
  • 对 python 源文件中的类定义进行排序的最佳方法是什么?

    我有一个包含许多类定义的 py 源 如下所示 class C code c class A code a class B code b 我想把它变成 class A code a class B code b class C code c
  • 数字矩阵 javascript

    我需要 JS 中一个函数的帮助 该函数按给定整数 N 打印矩阵 如下所示 N 2 Matrix 1 2 2 3 N 3 Matrix 1 2 3 2 3 4 3 4 5 我需要用两个循环来完成 但我不知道如何做 function solve
  • 如何禁用 JSpinner 的键盘和鼠标输入?

    当我尝试使 JSpinner 无法通过键盘或鼠标编辑时 如下所示 DefaultEditor mySpinner getEditor getTextField setEditable false mySpinner setEnabled f
  • 我无法解决“为标识符注册的笔尖无效(BNRItemCell)”

    正在阅读 Big Nerd Ranch iOS 书 我在第二天尝试解决这个问题 我快要疯了 有人能帮忙吗 我收到以下错误消息 2014 06 20 11 37 18 764 Homepwner 10388 60b 由于未捕获的异常 NSIn
  • 当底层表发生变化时更新物化视图

    我有一个这样定义的物化视图 CREATE MATERIALIZED VIEW M FOO REFRESH COMPLETE ON COMMIT AS SELECT FOO ID BAR FROM FOO WHERE BAR IS NOT N
  • 是什么 ?关于常规变量?

    我在一些常规代码中看到了这样的内容 trip id encodeAsHTML 使用或不使用 id 有什么区别 它检查对象是否为空 使用它 可以防止空指针异常 如果您使用它 则应该将其用于整个对象 例如 trip id otherstuff
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • Django 和具有多个外键的模型

    我是 Django 的新手 到目前为止 它的功能给我留下了深刻的印象 我正在使用更复杂的模型 但无法正确使用它们 使用 Django 1 3 我尝试编写一个摘要页面 该页面将使用以下结构呈现下面的三个模型 换句话说 就是包含目的地和活动的旅
  • open_basedir 的影响和子域限制

    出于安全原因 我已将我的yiihtml 根目录下的文件夹 所以我的结构如下所示 conf httpdocs httpsdocs yii 运行该网站时 我收到错误 open basedir 限制yii php这是由index php out
  • AppBar Material UI 问题

    我对 Material UI 库还很陌生 但到目前为止我真的很喜欢它 但是 我遇到了 AppBar 组件覆盖在我的其他内容上的问题 我目前有
  • 维基百科上的汉字编码是什么?

    我在维基百科上查看中文字符的编码 但无法弄清楚它们正在使用什么 例如 的 被编码为 E7 9A 84 see here http upload wikimedia org wikipedia commons thumb a ae E7 9A
  • Maven - 检测同一依赖项的多个版本

    我刚刚经历了我的 Maven 项目的两个直接依赖项的情况 它们具有特定传递依赖项的两个不同版本 在我的特定情况下 我直接依赖于以下内容
  • 我可以将节点文本包装在 WinForms TreeView 中吗

    ASP NET TreeView 有一个 NodeWrap 属性 是否有在 WinForms TreeView 中完成相同操作的等效方法 EDIT 感谢您对其他控件的建议 不幸的是我的客户不允许使用第三方控件 这似乎不可能 您可能会寻找具有
  • CreateProcess 和奇怪的 nslookup 错误

    我有一个经常使用的 api 例程来捕获 dos 输出 最近发现了一个奇怪的错误 它似乎不允许 dns 调用 例如 nslookup 将返回 服务器无响应 错误 服务器 未知 如果您向其提供 IP 地址 Ping 将起作用 但如果它必须进行