天道酬勤,学无止境

NtCreateProcess 和 ZwCreateProcess 有什么区别?(What is the difference between NtCreateProcess and ZwCreateProcess?)

问题

NtCreateProcessZwCreateProcess有什么区别? 在 ntdll.dll 中, NtCreateProcessZwCreateProcess都指向完全相同的地址

回答1

在用户模式下,Nt 和 Zw API 组是相同的。 在内核模式下,它们是不同的。 Nt API 包含实际的实现。 Zw API 使用系统调用机制并确保它在内核模式下调用,并且如果参数包含用户模式地址,则无需检查参数。 否则,您可以在用户模式下使用带有内核参数的 API,这并不好。 所以它只是一个安全机制。

回答2

除了已经给出的答案(我不想鹦鹉学舌)之外,我认为最好的答案可以在 OSR Online 上找到:这里。

或者,您可以阅读有关 Native API 的书籍,例如 Gary Nebbett 的一本名为“Windows NT/2000 Native API Reference”的书籍,他在这个问题上花了一些篇幅,或者您可以使用 WinDbg(发音为“wind-bag” ) 你自己。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • What is the difference between NtCreateProcess and ZwCreateProcess?
    What is the difference between NtCreateProcess and ZwCreateProcess? In ntdll.dll, both NtCreateProcess and ZwCreateProcess point to exactly the same address
  • Windows最接近fork()的东西是什么?(What is the closest thing Windows has to fork()?)
    问题 我想这个问题说明了一切。 我想在Windows上进行分叉。 什么是最相似的操作以及如何使用它。 回答1 Cygwin在Windows上具有全功能的fork()。 因此,如果您可以接受使用Cygwin,那么在性能不成问题的情况下,可以解决此问题。 否则,您可以看看Cygwin如何实现fork()。 从一个相当老的Cygwin的体系结构文档中可以得出: 5.6。 流程创建Cygwin中的fork调用特别有趣,因为它无法在Win32 API上很好地映射。 这使得正确实施非常困难。 当前,Cygwin分支是一种非写时复制实现,类似于早期UNIX版本中提供的实现。 父进程派生子进程时发生的第一件事是,父进程为子进程初始化了Cygwin进程表中的空间。 然后,它使用Win32 CreateProcess调用创建一个暂停的子进程。 接下来,父进程调用setjmp保存其自己的上下文,并在Cygwin共享内存区域(在所有Cygwin任务之间共享)中设置指向此上下文的指针。 然后,通过从其自己的地址空间复制到暂挂的子代的地址空间中,来填充子代的.data和.bss节。 初始化子级的地址空间后,在父级等待互斥时运行子级。 孩子发现使用已保存的跳转缓冲区已将其分叉并进行了长时间跳跃。 然后,孩子设置父母正在等待的互斥锁,并阻止另一个互斥锁。 这是父级将其堆栈和堆复制到子级中的信号
  • Can There be a Process WITHOUT an Executable-Backed Image?
    After looking at various pages like OSR Online and NtInternals, it seems like NtCreateProcess (and ZwCreateProcess) specify that giving a handle to a memory section is optional! Does this mean that we can have processes that are not backed by executable images? If so, what could they be (or are they) used for potentially? Does that mean we can copy an executable entirely into memory and subsequently even delete the file from the disk, and have the process continue running?? That would seem like a really useful feature.
  • 系统调用SystemCalls-1-总述
    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://en.wikipedia.org/wiki/System_call 总述内容主要来自于wikepedia中的介绍,主要回答三个问题: 什么是系统调用?系统调用的数目有多少?系统调用函数的通常分类是什么? 关于系统调用 计算机中系统调用,指计算机程序执行时请求操作系统内核提供的服务。调用通常可能涉及硬件相关服务(例如涉及硬盘驱动)、或创建和执行一个新进程、或与基础内核服务通信(比如进程调度)。系统调用在进程与操作系统之间提供了一个必要的接口。 在大多数系统中,系统调用仅在用户空间进程中使用;但在一些系统如IBM的OS/360和它的继承者系统中,特权系统代码也启用了系统调用。 from wikepdia --- In computing, a system call (commonly abbreviated to syscall) is the programmatic way in which a computer program requests a service from the kernel of the operating system on which it is executed. This may include hardware-related
  • 2021年Java1000道高频面试题集锦(含答案),让你在吊打大厂面试官的路上畅通无阻!叼
    或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。 凡事预则立,不预则废。能读到这里的人,我相信都是这个世界上的“有心人”,还是那句老话:上天不负有心人!我相信你的每一步努力,都会收获意想不到的回报。 包含的模块 本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM ,如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 本文只列出面试题,(答案)可转发+关注,私信我【面试】即可领取284页面试宝典及面试答案 Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗? 4. final 在 Java 中有什么作用? 5. Java 中的 Math
  • new Observable 和 of 或 from 有什么区别?(What is the Difference between new Observable and of or from?)
    问题 新的 Observable 和从 of 或 from 创建的 observable 有什么区别? of([1, 2, 3]).subscribe(x => console.log(x)); from([1, 2, 3]).subscribe(x => console.log(x)); 与new Observable() 上述两种创建 observable 的方式的主要区别是什么? 我读过这个,但它仍然没有说服力! RxJs 中的“new Observable()”和“of()”有什么区别 我不是在问 of 和 from 之间的区别。 我在问(of 或 from)与 new Observable() 之间的区别 回答1 本质上,可观察到的创建功能of , from和别人简单地创建一个new Observable()与特定的行为。 因此, new Observable()和creator 函数之间的唯一区别是实际行为。 例如,下面是of()函数的样子(简化): export function of<T>(...array: Array<T>): Observable<T> { return new Observable<T>(subscriber => { for (let i = 0; i < array.length && !subscriber.closed; i++) {
  • rspec be nil 和 be_nil 有什么区别(rspec what is the difference between be nil and be_nil)
    问题 我正在使用 rspec 和断言 student.name should be nil student.name should be_nil 两者似乎都有效。 使用be nil和be_nil有区别be_nil ??? 回答1 真的没有区别,除了be nil是动态定义的,并且be_nil是由 rspec 专门编程的。 当你说should.be something ,rspec 会尝试以下操作 [:==, :<, :<=, :>=, :>, :===].each do |operator| define_method operator do |operand| BeComparedTo.new(operand, operator) end end 然而,当你尝试should.be_nil它只是检查 object.nil? https://github.com/rspec/rspec-expectations/blob/master/lib/rspec/matchers/built_in/be.rb 回答2 我认为没有区别,但它用于与其他方法(如be_true或be_false保持一致。 在引擎盖be检查两个元素的id : 与nil 以true失败,因为在 Ruby 中,一切都不是false也不是nil都是true 失败与false ,因为两个nil和false赛
  • Environment.CurrentDirectory 和 Directory.GetCurrentDirectory 有什么区别?(What is the difference between Environment.CurrentDirectory and Directory.GetCurrentDirectory?)
    问题 在 .NET 中,有什么区别: Environment.CurrentDirectory Directory.GetCurrentDirectory() ? 当然, Environment.CurrentDirectory是一个可以设置和获取的属性。 还有其他区别吗? 回答1 正如大卫所说:他们做同样的事情。 在内部,当获取Environment.CurrentDirectory它会调用Directory.GetCurrentDirectory并且在设置Environment.CurrentDirectory它会调用Directory.SetCurrentDirectory 。 只需选择一个最喜欢的并使用它。 回答2 根据其他答案,没有区别 - Environment.CurrentDirectory的实现委托给Directory的Get和Set方法。 这引发了一个有趣的风格 API 设计问题 - 为什么Environment的设计者认为常规属性是合适的,而Directory的设计者更喜欢显式的Get和Set方法? 框架设计指南一书对选择属性与方法有相当多的论述,其中一些可在线获取。 在我看来,最相关的部分是(我的重点): 一条经验法则是,方法应该代表动作,而属性应该代表数据。 如果其他一切都相同,则属性优先于方法 ... 考虑使用属性,如果成员表示该类型的逻辑属性
  • javascript中的arguments和parameters有什么区别?(What is the difference between arguments and parameters in javascript?)
    问题 我知道参数是传递给函数的变量,并为函数中的参数赋予值,但我无法理解: javascript 中“参数”和“参数”之间的主要区别是什么? 回答1 参数是将传递给函数的值的别名。 参数是实际值。 var foo = function( a, b, c ) {}; // a, b, and c are the parameters foo( 1, 2, 3 ); // 1, 2, and 3 are the arguments 回答2 参数(如果有)定义方法签名。 参数是传递给函数的值。 但我猜同样的区别。 void function(int param1, string param2) //defines the types the function must receive 。 function(1, "Hello World") 1 和 "Hello World" 作为参数传递。 参数接收(如果你喜欢)参数。 在这里解释得很好 回答3 13 功能定义句法 函数声明: 函数标识符 ( FormalParameterList (opt) ) { FunctionBody } 函数表达式: function Identifieropt ( FormalParameterList (opt) ) { FunctionBody } 正式参数列表: 标识符 形式参数列表,标识符 函数体:
  • HashSet 和 Set 有什么区别,什么时候应该使用它们?(what is the difference between HashSet and Set and when should each one be used?)
    问题 HashSet和Set什么区别,什么时候应该使用它们? 这是Map与HashMap : val hashSet = HashSet("Tomatoes", "Chilies") val set = Set("Tomatoes", "Chilies") set == hashSet // res: Boolean = true 回答1 Set是一个特征。 您可以通过调用其伴随对象的apply方法来创建Set的实例,该方法返回默认的不可变Set的实例。 例如: val defaultSet = Set("A", "B") HashSet是Set的具体实现,可以按如下方式实例化: val hashSet = HashSet("A", "B") 看看“Programming in Scala”中的引用,它解释了各种实现之间的差异: 例如, scala.collection.mutable.Set()工厂方法返回一个scala.collection.mutable.HashSet ,它在内部使用哈希表。 同样, scala.collection.mutable.Map()工厂返回一个scala.collection.mutable.HashMap 。 不可变集合和地图的故事更复杂一些。 例如,由scala.collection.immutable.Set(
  • render()和renderStatic()有什么区别,TYPO3写ViewHelper时应该用什么(What is the difference between render() and renderStatic() and what should be used when writing a ViewHelper in TYPO3)
    问题 有几个编写自定义 ViewHelper 的示例以及不同的做事方式。 我见过使用 render() 和使用 renderStatic 的示例(例如在开发自定义 ViewHelper 中)。 在 24 Fluid Tips 中有一个解释,但我不明白,它没有让我清楚为什么有 2 个函数以及应该在哪里使用什么。 中断性更改(不推荐使用 ViewHelpers 上的渲染方法参数)和各个地方的零散信息使得在这里很难得到明确的答案。 开发自定义 ViewHelper 中的示例是否是最新的和最佳实践的? 回答1 ▸渲染静态() 首先, renderStatic()是一个静态的PHP 方法。 这意味着,您无权访问实例属性,例如$this->tag ,例如当您的 ViewHelper 类是AbstractTagBasedViewHelper的子类时,这是必需的。 renderStatic()另一个缺点是您无法访问子节点。 在下面的例子中,一个子节点是例如<f:then> : <f:if condition="{variable}"> <f:then> ... </f:then> </f:if> 话虽如此, renderStatic()具有最佳性能,因为它是从已编译的 Fluid 中调用的。 因此,应尽可能使用此方法。 ▸渲染() 在某些情况下,此方法是更好的选择,或者必须用于特定用例
  • memcpy() 和 strncpy() 之间有什么区别,因为后者很容易替代前者?(What is the difference between memcpy() and strncpy() given the latter can easily be a substitute for the former?)
    问题 memcpy()和strncpy()之间的显着区别是什么? 我问这个是因为我们可以很容易地改变strncpy()来复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换为char*并将第三个参数更改为那个非字符类型。 在下面的程序中,我成功地使用它将整数数组的一部分复制到另一个数组中,它的效果与memcpy()一样好。 #include <stdio.h> #include <string.h> int main () { int arr[2]={20,30},brr[2]={33,44}; //memcpy(arr,brr,sizeof(int)*1); strncpy((char*)arr,(char*)brr,sizeof(int)*1); printf("%d,%d",arr[0],arr[1]); } 同样,我们可以使其适用于float或其他数据类型。 那么与memcpy()的显着区别是什么? PS:另外,我想知道为什么memcpy()在string.h头文件中,因为几乎所有的库函数都与字符串相关,而memcpy()本质上更通用。 任何原因? 回答1 简单的区别是memcpy()可以复制带有嵌入空字符的数据(也就是 C 样式字符串中的字符串终止符),而strncpy()只会将字符串复制到给定的字符数或位置的最大值第一个空字符(并用 0
  • 文件读取和流式传输有什么区别?(what is difference between file reading and streaming?)
    问题 我在一些书中读到使用流比在node.js 中一次读取整个文件更好,我理解这个想法..但我想知道不是使用流读取文件,我已经习惯了 Java 和 C++ ,当我想读取文件时,我使用流。那么这里有什么区别?? 还有fs.createReadStream(<somefile>);之间的区别是什么fs.createReadStream(<somefile>); 和fs.readFile(<somefile>); 两者都是异步的,对吧!! 回答1 首先是 fileread 是完全缓冲的方法。 流是部分缓冲的方法。 现在是什么意思? 完全缓冲的函数调用,如 readFileSync() 和 readFile() 将数据公开为一个大 blob。 也就是说,执行读取,然后以同步或异步方式返回完整的数据集。 使用这些全缓冲方法,我们必须等到所有数据都被读取,并且 Node 内部需要分配足够的内存来将所有数据存储在内存中。 这可能会有问题 - 想象一个从磁盘读取 1 GB 文件的应用程序。 只有完全缓冲访问,我们需要使用 1 GB 的内存来存储文件的全部内容以供读取——因为 readFile 和 readFileSync 都返回一个包含所有数据的字符串。 部分缓冲的访问方法是不同的。 它们不会将数据输入视为离散事件,而是将其视为在读取或写入数据时发生的一系列事件。 它们允许我们在从磁盘/网络/其他
  • MVC 6 视图组件与部分视图:有什么区别? 每个应该什么时候使用? [关闭](MVC 6 View Components vs. Partial Views: What is the difference? When should each be used? [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 3年前关闭。 改进这个问题 MVC 6 引入了视图组件,并表示它比部分视图更强大和灵活。 视图组件是否旨在替换部分视图? 每种实现有什么区别以及需要什么样的情况? 回答1 根据此链接- https://docs.asp.net/en/latest/mvc/views/view-components ASP.NET MVC 6 的新特性,视图组件 (VC) 类似于部分视图,但它们更强大。 VC 包括在控制器和视图之间发现的相同的关注点分离和可测试性优势。 您可以将 VC 视为一个微型控制器——它负责呈现一个块而不是整个响应。 所以它只是局部视图的增强,另一个区别是当你使用局部视图时,你仍然依赖于控制器,而在视图组件中你不需要控制器。 因此存在关注点分离。 有一篇关于 ASP.NET 视图组件的详细文章。 http://www.tugberkugurlu.com/archive/exciting-things-about-asp-net-vnext-series-mvc-view-components 回答2 您可能想要使用ViewComponent而不是PartialView的示例: 您需要编写一堆业务逻辑,例如您可能需要联系 3rd 方 Web
  • Thread.start()和Thread.run()有什么区别?(What is the difference between Thread.start() and Thread.run()?)
    问题 为什么我们调用start()方法,又调用run()方法? 我们不能直接调用run()吗? 请举一个有区别的例子。 回答1 不,你不能。 调用run将在同一线程中执行run()方法,而无需启动新线程。 回答2 为什么我们调用start()方法,又调用run()方法? 不,这是不精确的。 依次调用start()不会调用run方法。 相反,它启动执行run方法的线程。 这是本地的。 我们不能直接调用run()吗? 如果直接调用run()而不启动线程,则只需在同一调用者方法上执行该方法即可。 请举一个有区别的例子。 网络上有数百万。 因此,我不会重复。 回答3 实际上thread.start()创建一个新线程并具有自己的执行方案。 但是thread.run()不会创建任何新线程,而是在当前正在运行的线程中执行run方法。 因此,如果您正在使用thread.run()那么请您想一想,如果您只想让一个线程执行所有run方法,那么多线程的用途是什么。 回答4 因为start()不只是调用run()。 它启动一个新线程,并在该线程中调用run()。 回答5 您不能直接运行run()方法。 每当使用thread.start()启动线程时,就会调用run()方法并执行进一步的操作。 回答6 主要区别在于,当程序调用start()方法时,将创建一个新线程,并在新线程中执行run()方法中的代码
  • conda install 和 conda update 有什么区别?(What is the difference between conda install and conda update?)
    问题 conda install 和 conda update 有什么区别? 我浏览了文档,没有看到任何明显的区别。 文档说: 从conda install : Conda 尝试安装所请求软件包的最新版本。 为此,它可能会更新一些已安装的软件包,或安装其他软件包。 要防止更新现有包,请使用 --no-update-deps 选项。 这可能会强制 conda 安装请求包的旧版本,并且不会阻止安装其他依赖包。 从conda update : Conda 尝试安装所请求软件包的最新版本。 为此,它可能会更新一些已安装的软件包,或安装其他软件包。 要防止更新现有包,请使用 --no-update-deps 选项。 这可能会强制 conda 安装请求包的旧版本,并且不会阻止安装其他依赖包。 回答1 这正是您提供的文档所说的。 对于 conda 安装: 将软件包列表安装到指定的 conda 环境中。 对于 conda 更新: 将 conda 包更新到最新的兼容版本。 回答2 在问题中引用的文档文本的上下文中 ... Conda 尝试安装所请求软件包的最新版本.... 需要强调的是,文档并没有完全清楚地说明安装和更新之间的区别。 文档对安装的内容有相同的解释而没有澄清条件这一事实肯定有点令人困惑(至少对我而言)。 安装和更新之间的隐含区别不仅在于,如果您尝试更新不存在的包(问题的评论中提到的内容
  • git diff HEAD 与 git diff --staged 有什么区别?(What is the difference between git diff HEAD vs. git diff --staged?)
    问题 git diff HEAD和git diff --staged什么git diff --staged ? 我尝试了两者,但都给出了相同的输出。 回答1 假设git status这个输出: $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: y # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: x # 如您所见,有一个文件已修改但未暂存以进行提交,并添加了一个准备提交的新文件。 git diff --staged将只显示“staged”区域中文件的更改。 git diff HEAD将显示对跟踪文件的所有更改。 如果您已将所有更改暂存为提交,则两个命令将输出相同的结果。 回答2 git diff查看Stage和Working Directory的区别 git diff -
  • 这些(bCondition == NULL)和(NULL == bCondition)有什么区别?(What is the difference between these (bCondition == NULL) and (NULL==bCondition)?)
    问题 在探索msdn站点时,大多数条件检查位置都在使用它们(NULL == bCondition)。 使用这些符号的目的是什么? 请提供一些样本来解释这些。 谢谢。 回答1 NULL == condition的使用在输入错误的情况NULL == condition提供了更有用的行为,即偶然使用了赋值运算符=而不是比较运算符== : if (bCondition = NULL) // typo here { // code never executes } if (NULL = bCondition) // error -> compiler complains { // ... } 在前一种情况下,C编译器会发出警告,在许多语言中都没有这样的警告。 回答2 这就是所谓的尤达条件。 (原始链接,您需要很高的代表才能看到它)。 它的意思是在打算进行相等比较==情况下防止意外赋值= 。 如果您习惯养成Yoda并通过写=而不是==进行拼写错误,则代码将无法编译,因为您无法分配给右值。 这值得尴尬吗? 有人不同意说编译器在条件表达式中看到=时会发出警告。 我说过,我一生只发生过两次或三次错误,但这并不能证明我将我一生中编写的所有MLOC都改为该惯例是合理的。 回答3 没有区别。 这是一种古老的防御性编程方式,已经有20多年的历史了。 目的是防止比较两个值时意外键入=而不是==。
  • Java Non Heap Memory和Stack Memory有什么区别? 如果不是,它们是否相同?两者之间有什么区别?(What is the difference between Java Non Heap Memory and Stack Memory? Are they Same if not what is the difference between them?)
    问题 我正在使用Jconsole监视Java应用程序。 内存选项卡显示不同的堆和非堆内存,例如 堆内存使用情况非堆内存使用内存池“ CMS Old Gen” 内存池“ Par Eden Space” 内存池“ Par Survivor Space” 内存池“代码缓存” 内存池“ CMS Perm Gen” 这些术语之间有什么区别。 还请提供一些有关-如何通过监视这些参数来发现应用程序行为异常的信息。 回答1 在所有基于C的语言(和大多数其他语言)中,基本上有三类存储: 堆堆静态(有多种变体) 堆你熟悉的。 您也很熟悉堆栈,但您只是不知道。 当您具有带有“局部”变量的方法时,这些变量将在“调用框架”中分配。 调用方法时分配“调用框架”,从方法返回时将其删除,因此,最有效的方法是使用随调用而增长而随返回而收缩的“堆栈”来实现。 静态是您没有明确分配的东西,并且从程序开始执行时就已经存在。 堆栈所需的空间通常很小,并且与上述类别中的“非堆内存”集中在一起。 回答2 非堆内存是JVM为堆目的以外分配的所有内存。 这包括: 调用堆栈(如您所述); 由本机代码分配的内存(例如,用于堆外缓存); 在HotSpot 8中,元空间(永久代)。 JIT编译器使用的内存(已编译的本机代码)。 在您的列表中,“ CMS Old Gen”,“ Par Eden Space”,“ Par Survivor
  • 成员变量和局部变量有什么区别?(What is the difference between a member variable and a local variable?)
    问题 成员变量和局部变量有什么区别? 他们是一样的吗? 回答1 成员变量是类型的成员,并且属于该类型的状态。 局部变量不是类型的成员,而是表示局部存储,而不是给定类型的实例的状态。 但是,这都是非常抽象的。 这是一个C#示例: class Program { static void Main() { // This is a local variable. Its lifespan // is determined by lexical scope. Foo foo; } } class Foo { // This is a member variable - a new instance // of this variable will be created for each // new instance of Foo. The lifespan of this // variable is equal to the lifespan of "this" // instance of Foo. int bar; } 回答2 局部变量是您在函数中声明的变量。 成员变量是您在类定义中声明的变量。 回答3 成员变量有两种:实例变量和静态变量。 一个实例变量的持续时间与该类的实例一样长。 每个实例将有一个副本。 静态变量的持续时间与类相同。 整个课程只有一份。 局部变量在方法中声明