如何在windows程序中读取bios内容

今天和夜月兄讨论了一下在windows nt/2000/xp下如何读取bios信息,现在把结果向大家汇报一下。

大家都知道,windows接管了对物理内存的直接存取,而bios信息存在物理内存的f000:0000处,关键就是如何读取物理内存。

查阅了msdn的文章后,发现以下有几个函数和物理内存访问有关:

NTSTATUS ZwOpenSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSTATUS ZwMapViewOfSection(IN HANDLE SectionHandle,
               IN HANDLE ProcessHandle,
               IN OUT PVOID *BaseAddress,
               IN ULONG ZeroBits,
               IN ULONG CommitSize,
               IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
               IN OUT PSIZE_T ViewSize,
               IN SECTION_INHERIT InheritDisposition,
               IN ULONG AllocationType,
               IN ULONG Protect
               );
NTSTATUS ZwUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);

用到的结构定义如下

typedef struct _UNICODE_STRING {
  USHORT Length;//长度
  USHORT MaximumLength;//最大长度
  PWSTR Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串"\device\physicalmemory"
} UNICODE_STRING,*PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
   ULONG Length;//长度 18h
   HANDLE RootDirectory;// 00000000
   PUNICODE_STRING ObjectName;//指向对象名的指针
   ULONG Attributes;//对象属性00000040h
   PVOID SecurityDescriptor;    // Points to type SECURITY_DESCRIPTOR,0
   PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;

函数说明

第一个函数ZwOpenSection用来打开section,第一个参数是指向HANDLE变量的指针,第二个是访问参数,第三个是指向OBJECT_ATTRIBUTES的指针

第二个函数ZwMapViewOfSection用来建立物理内存和当前进程的一段物理内存的联系,参数很多,一会在例程里再详细解释

第三个函数ZwUnmapViewOfSection用来断开物理内存和当前进程中的映射断开联系,第一个参数是进程句柄,必须掉用第二个函数时一样,第二

个是当前进程中映射的基址,由ZwMapViewOfSection返回

这三个函数都在ntdll.dll中,msdn里的帮助说这几个函数用在驱动编制上。

时间: 2024-11-05 14:44:05

如何在windows程序中读取bios内容的相关文章

如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图(转)

window|程序 如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图在 Java 应用程序中加载位图文件的逐步指南 作者:Jeff West 和 John D. Mitchell 摘要目前,标准的 getImage() 方法仅支持 GIF 和 JPEG 图像.尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序.Jeff West 撰写的这篇技巧提供了加载

如何在Windows 8中设置多个显示器

小左教你如何在Windows 8中设置多个显示器,让你的屏幕显示炫起来. 详情参考: 目录: 1. 设置多个显示器 2. 双显示器使用的关键功能增强 3. 连接显示器 1. 多个显示器 目前已引入一些更改,它们将为计算机 连接多个显示器的用户提供更好的体验. 您可以从Windows UI或桌面界面开始使用多个显示器. 对于Windows UI: 1.通过手指从右侧滑入或将鼠标光标移到右侧边角之一,可调用Windows Charms. 2.选择设备. 3.选择第二个屏幕. 4.一共有四个选项:PC

如何在 Windows 10 中搭建 Node.js 环境?

[编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中,笔者将展示如何在 Windows 10 中搭建 Node.js 环境.并且,作为检验,笔者会在新搭建的环境中运行自己正在努力的一个项目(该项目依赖于 koa, pg, amqplib 等模块). 请注意:本文的首要目的是为 Node.js 项目搭建开发者环境,而非运行某个项目.笔者随后会介绍如何部

设置-如何在.Cpp程序中调用.c程序中的函数?

问题描述 如何在.Cpp程序中调用.c程序中的函数? 我在软件中需要把mp3文件转换成wav文件.为此从网上下载了一个转换程序.但把这些转换程序的文件加入到我的用VC6.0编写的MFC工程中后却发现编译通不过.为此,我把Project Settings中这些文件对应的Precompiled Headers都设置成Not using precompiled headers.这样,编译能通过了.但连接却通不过.我的具体程序和现象如下: 我在我的一个.cpp文件中需要调用如下函数: BOOL mp3T

在C#应用程序中读取WORD文档,需要引用哪个命令空间

问题描述 在C#windows应用程序中读取WORD文档,并对该文档做一定的修改需要引用哪个命令空间? 解决方案 解决方案二:MicrosoftWordXObjectLibrary,其中X为版本号.Word2007对应12.0,Word2003对应11.0,在Com选项卡下解决方案三:在要操作word文档的program.cs中,加上usingMSWord=Microsoft.Office.Interop.Word;usingSystem.IO;usingSystem.Reflection;其他

如何在Java程序中访问mysql数据库中的数据并进行简单的操作_Mysql

在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据并进行简单的操作,具体详情请看下文. 创建一个javaProject,并输入如下java代码: package link; import java.sql.*; /** * 使用JDBC连接数据库MySQL的过程 * DataBase:fuck, table:person: * 使用myeclipse对mysql数据库进行增删改查的基本操作. */ public

如何在Windows Azure中使用Java相关技术

我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序(PetClinic 示例应用程序)迁移到 Windows Azure 云.此文档附带的代码同样也发布在 GitHub 中.我们鼓励 Java 开发人员下载并探索此新示例和教程. Windows Azure 是一个开放的云平台,它支持各种编程语言和框架,包括 Microsoft .NET.Java.N

如何在c程序中使用汇编编程

如何在c程序中使用汇编编程 方法一:在每个汇编语句前加asm即可.如 void reset_data(void) { asm movr0,#0dfh asmdo_resetdata: asm mov@r0,#00h asm djnzr0,do_resetdata return; } 方法二:把asm作为关键字后续汇编用大括号括起来即可.如下: void reset_data(void) { asm {movr0,#0dfh do_resetdata: mov@r0,#00h djnzr0,do_

如何在Windows 7中创建VHD文件

  VHD文件对于使用过Virtual PC的用户来说不会陌生,如今微软将VHD完全植入到Windows 7操作系统里,VHD文件不再是Virtual PC私人领地了. 如何在Windows 7中创建VHD文件呢?方法有两种,一种是纯命令行方式,一种是图形化界面操作.考虑到命令行模式需要记忆一些命令和参数,为了避免出错,这里以图形化的菜单操作为例介绍一下如何创建.配置以及删除VHD文件. 右键点击开始菜单或者桌面上的计算机,选择"管理",进入"计算机管理"窗口; 在