什么是API//DLL//NT架构//MessageBoxA函数//WOW64

目录

API

DLL 

Windows NT

 MessageBox函数

 WOW64



API

API = Application Programming Interface

API的英文即Application Programming Interface首字母的缩写。不要被这么长的单词吓到,直译过来的意思就是:程序之间的接口。我更倾向于把API理解为,程序之间的合约。

1.类似一个函数调用的过程,就是别的人开发好了一些程序去实现一些功能,然后你去调用这个功能。

2.一个很好的比喻,你要造一辆车,但是,你现在需要一些轮子,然后你就可以去看看市面上一些厂家的轮子,去调用他(有时候,去”化用“别人的轮子比自己造的更加坚固耐用emmm)、

3.API接口就是类似于卖轮子的老板,你把你的需求给他,他根据你的信息提供,跑去自己店里找到一个合适的给你,具体怎么找的你并不知道。

4.体现在计算机逆向方面的一个例子就是,现在使用的windows,就是有一个api接口,通过这个接口去访问window这个功能的操作系统。

参考:

API是什么: 一篇讲透API - 知乎 (zhihu.com)

新手上路:什么是API接口_木亦Sam的博客-CSDN博客_api接口是前端写还是后端

如何理解API,API 是如何工作的_仁杰兄的博客-CSDN博客_api

MessageBoxA 函数 (winuser.h) - Win32 apps | Microsoft Learn

DLL 

 DLL的全称是Dynamic Link Library,中文叫做“动态链接文件”,在Windows操作系统中,DLL对于程序执行是非常重要的,因为程序在执行的时候,必须链接到DLL文件,才能够正确地运行。

动态链接库的调用,有静态调用与动态调用。

其次,它们都有着相应的使用方向与范围,各有千秋;

最后,动态链接库,可以理解成是一种封装,然后无论是静态调用,抑或是动态调用,其实就是对这种经过封装好的函数,直接调用即可。
这样做的好处,不仅可以简化代码,而且,还可以对代码进行重构,与拓展新的函数
 

优点:
(1) 更加节省内存并减少页面交换;

(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

(4)适用于大规模的软件开发,使开发过程独立、相互依赖性小,便于不同开发者和开发组织之间进行开发和测试。

(5)节约磁盘空间:当应用程序使用动态链接时,多个应用程序可以共享磁盘上单个DLL副本。相比之下,当应用程序使用静态链接库时,每个应用程序要将库代码作为独立的副本链接到可执行镜像中。

(6)多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。
(7)动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。

缺点:
使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;

速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统死掉。
 

参考:https://blog.csdn.net/qq_38998213/article/details/95082883

Windows NT

Windows NT在最初开发的主要目的之一是硬件和软件的可移植性,Windows NT最初开发的目标处理器是非x86的intel i860,并采用其代号(N-Ten)命名项目。Windows NT最初为IA32、MIPS和DEC Alpha架构开发,并在后续的不同的NT版本中支持PPC、IA64(Itanium)、x86-64、ARM等处理器架构。

在Windows NT中,内核(kernel)可以直接访问RAM和硬件,而内核由几个负责管理资源的Executive子系统(Executive subsystems)组成,包括流程管理器(Process Manager)、I/O管理器、虚拟内存管理器(Virtual Memory Manager,)、安全参考监视器以及处理调度和中断(scheduling and interrupts)的微内核。

和绝大多数市面上的现代操作系统一样,Windows NT有两种运行模式:用户模式(User Mode)和内核模式(kernel Mode),为了稳定性和多任务处理能力等,在用户模式下,应用程序无法直接访问硬件,若用户模式下的组件需要访问硬件或者分配物理和逻辑空间,则须调用内核。

为了Windows NT的软件可移植性,HAL(Hardware abstraction)是Windows NT中实现的硬件抽象层,用于模拟特定系统平台的细节使程序可以直接访问硬件的资源。

 2000年以前我们说的windows与我们现在说的windows有所区别,我们现在说的windows(win2000,winxp,win2003,winvista,win2008,win7)其实是windows NT,全称Microsoft Windows NT(New Technology)即视窗NT是由微软公司发行的操作系统。

 Windows NT是基于OS/2 NT的基础编制的。OS/2是由微软和IBM联合研制,分为微软的Microsoft OS/2 NT与IBM的IBM OS/2。协作后来不欢而散,IBM继续向市场提供先前的OS/2版本,而微软则把自己的OS/2 NT的名称改为Windows NT,即第一代的Windows NT 3.1。Windows NT是纯32位操作系统,采用先进的NT核心技术。NT即新技术(New Technology)。

 Windows NT包括两个版本,分别是Windows NT Workstation 和Windows NT Server 。Windows NT Workstation的设计目标是工作站操作系统,适用于交互式桌面环境;Windows NT Server的设计目标是企业级的网络操作系统,提供容易管理、反应迅速的网络环境。两者在系统结构上完全一样,只是为适应不同应用环境在运行效率上做相应调整。Windows NT Server具有更多的高级功能,可把Windows NT Workstation 看作它的子集。
————————————————

原文链接:https://blog.csdn.net/cz_water/article/details/4723644

 MessageBox函数

1.就是messageBox函数是一个将计算机的反馈信息可视化的函数,可以从联想Windows开发中看出来。

显示一个模式对话框,其中包含系统图标、一组按钮和一条简短的应用程序特定消息,例如状态或错误信息。 消息框返回一个整数值,该值指示用户单击的按钮。

 MessageBoxA 函数 (winuser.h) - Win32 apps | Microsoft Learn

 

 

 WOW64

一个工具人,把32位和64位来回转换的东西

WOW64既不支持16位应用程序的执行(32位 Windows支持16位应用程序的执行),

也不支持加载32位内核模式的设备驱动程序。

WOW64进程只能加载32位的DLL,不能加载原生的64位DLL。

类似的,原生的64位进程不能加载32位的 DLL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 JNI 调用 Windows API 的示例代码: 首先,我们需要编写一个 C 文件,实现我们需要调用的 Windows API 函数,并将其编译成 DLL。例如,我们需要调用 MessageBoxA 函数,可以编写以下代码: ``` #include <windows.h> #include <stdio.h> #include "jni.h" JNIEXPORT void JNICALL Java_com_example_MessageBox_messageBox(JNIEnv* env, jobject obj, jstring message) { const char* utfMessage = (*env)->GetStringUTFChars(env, message, NULL); MessageBoxA(NULL, utfMessage, "Message", MB_OK | MB_ICONINFORMATION); (*env)->ReleaseStringUTFChars(env, message, utfMessage); } ``` 这个函数接受一个字符串参数,调用 Windows APIMessageBoxA 函数,并显示消息框。 接下来,我们需要将这个 C 文件编译成 DLL。这里使用 MinGW-w64 编译器,可以使用以下命令: ``` x86_64-w64-mingw32-gcc -shared -o MessageBox.dll MessageBox.c ``` 这将生成一个名为 MessageBox.dllDLL 文件。 现在,我们可以在 Java 中使用 JNI 调用这个 DLL。首先,我们需要加载这个 DLL: ``` System.loadLibrary("MessageBox"); ``` 然后,我们可以调用这个 DLL 中的函数: ``` public class MessageBox { static { System.loadLibrary("MessageBox"); } public static native void messageBox(String message); public static void main(String[] args) { MessageBox.messageBox("Hello from JNI!"); } } ``` 这个 Java 类中包含一个名为 messageBox 的本地方法,它调用了我们刚刚编写的 C 函数。在 main 方法中,我们调用这个本地方法,传入一个字符串参数,这个字符串将被显示在消息框中。 这样,我们就完成了使用 JNI 调用 Windows API 的示例。需要注意的是,这个示例中使用了 MinGW-w64 编译器,如果使用其他编译器,可能需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值