windows 执行任何操作都是通过调用API来实现的么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows 执行任何操作都是通过调用API来实现的么相关的知识,希望对你有一定的参考价值。

说得具体点,我不太明白。最好能从windows的层次构架来解释一下,谢谢了

我觉得不一定全是。windows的应用程序的执行应该都是由API来完成的,包括普通的应用程序和系统的应用程序。但是驱动程序好像不是由API来完成的。使用DDK,开发驱动程序,是windows系统要依赖它,它比系统还底层。

不过你问的是任何操作了,如果单是从应用程序的角度来看的话,全部都是通过API来完成的了。看一个基本的win32的应用程序吧!

.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szClassName db 'MyClass',0
szCaption db 'My First Window',0

.data?
hInstance dd ?
hWinMain dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程 ;窗口过程属于回调,回调由windows调用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc

pushad

mov eax,uMsg
;下面的分支就是你所有的操作都要在这里处理,相应的消息使用相应的API函数。
.if eax==WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;****************************************************************************
.else
//如果相应某消息你不处理,可以使用DefWindowProc让windows自行处理
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;****************************************************************************

xor eax,eax

popad

ret

_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG

invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;*****************************************************************************
;注册窗口类
;*****************************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName

invoke RegisterClassEx,addr @stWndClass
;*****************************************************************************
;建立并显示窗口
;*****************************************************************************

invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\
offset szCaption,WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;*****************************************************************************
;消息循环
;*****************************************************************************

.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax==0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw

ret

_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:
invoke _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

上面的程序是我学win32汇编时的内容。理解了这个就会明白一些基本的知识了。
参考技术A 一般来说是的

一般widows可以看成层次结构的

应用
----
api
---------
驱动
---------------
硬件

也就是说你的程序一般是调用api来和硬件打交道,比如说你要打印东西 你就要调用打印相关的api函数,然后api去调用驱动程序,驱动程序去操作硬件。

但是,api是且仅是windows通过库的型式提供的一套函数而已,你自己也可以定义一套api出来。

而且自己开发一些设备的驱动程序当然也是可以的。(否则硬件厂商就该去找微软拼命了)

更有甚者你可以连驱动都抛掉直接去读写硬件地址(当然在某些版本的windows中低级地址是被保护的,要通过iopm替换等手段才能得到权限)。本回答被提问者采纳
参考技术B 不一定

使用用户模拟来调用Azure AD Microsoft API的Web API

我有asp.net核心3.1 Web API项目,需要调用Microsoft Azure API(例如代表其他用户的存储API(模拟)。

我相信这可以通过Azure应用注册来实现,然后通过首先获取交互式令牌,然后通过Microsoft.Identity.Client库静默获取令牌来为用户创建模拟,

  1. 但是我不想从API内使用任何交互式身份验证,如何从我的API中执行此操作。
  2. 什么是用于Microsoft.Identity.Client.NET库的Web API身份验证的ASP.NET Core 3.0友好版本

任何示例都将有所帮助...

答案

如果您的Web api受Azure AD保护,则可以代表流使用。 Here是有关调用Web API的Web API的方案。

另一答案

您可以通过MSAL代表流(OBO)来实现代表用户(服务到服务的调用)获取令牌,您可以使用MSAL 2.3 +从文档here中检查文档和代码段。] >

以上是关于windows 执行任何操作都是通过调用API来实现的么的主要内容,如果未能解决你的问题,请参考以下文章

React + Redux App:通过 Redux 操作调用 API Vs 直接调用 API

API

操作系统的中断异常和系统调用

转载使用Win32API实现Windows下异步串口通讯

C#调用Windows API详解(上)

使用用户模拟来调用Azure AD Microsoft API的Web API