不知不觉间学驱动好像过了一年了,不过丫的又因为没怎么用所以结构跟常用的函数都记不住orz,于是就做个笔记当复习好了。
一个简单的驱动如下:
#include<ntddk.h>
typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING devicename;
UNICODE_STRING Symlink;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;
#pragma code_seg("PAGE")
NTSTATUS MyDispath(IN PDEVICE_OBJECT pdevobj,IN PIRP pirp)
{
KdPrint(("Dispath call!"));
return STATUS_SUCCESS;
}
#pragma code_seg("PAGE")
NTSTATUS MyUnload(IN PDRIVER_OBJECT pdrvobj)
{
NTSTATUS status;
PDEVICE_EXTENSION pdrvex ;
pdrvex = (PDEVICE_EXTENSION)pdrvobj->DeviceObject->DeviceExtension ;
status = IoDeleteSymbolicLink(&(pdrvex->Symlink));
if(!NT_SUCCESS(status))
{
KdPrint(("Delete Symbolic link fault!"));
return status;
}
IoDeleteDevice(pdrvobj->DeviceObject);
KdPrint(("Delete Device successfully!"));
return STATUS_SUCCESS;
}
#pragma code_seg("INIT")
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pobj , IN PUNICODE_STRING path)
{
PDEVICE_OBJECT pdev;
PDEVICE_EXTENSION pext;
NTSTATUS st;
UNICODE_STRING symboliclink;
UNICODE_STRING devicename;
KdPrint(("DriverEntry is called!!"));
RtlInitUnicodeString(&devicename,L"\\Device\\SimpleDriver");
RtlInitUnicodeString( &symboliclink, L"\\DosDevices\\SimpleDriver");
st = IoCreateDevice(pobj,
sizeof(DEVICE_EXTENSION),
&devicename,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&pdev);
if(!NT_SUCCESS(st))
{
KdPrint(("Create Device Fault!"));
return st;
}
pext = (PDEVICE_EXTENSION)pdev->DeviceExtension ;
pext->pDevice = pdev;
pext->devicename = devicename;
st = IoCreateSymbolicLink(&symboliclink,&devicename);
if(!NT_SUCCESS(st))
{
KdPrint(("Create Symbolic Link fault!"));
IoDeleteDevice(pdev);
return st;
}
pobj->MajorFunction[IRP_MJ_READ]=
pobj->MajorFunction[IRP_MJ_WRITE]=
pobj->MajorFunction[IRP_MJ_CREATE]=
pobj->MajorFunction[IRP_MJ_CLOSE]=MyDispath;
pobj->DriverUnload = MyUnload;
pext->Symlink = symboliclink;
KdPrint(("Create Device Success!"));
return STATUS_SUCCESS;
}
简单解释一下:
DriverEntry是驱动的入口函数,相当于Win32应用程序的入口函数WinMain跟普通C/C++程序的main。第一个参数为DRIVER_OBJECT类型的指针,是保存着驱动相关参数的结构。第二个参数为一个UNICODE_STRING的指针,保存着驱动写进注册表的相关信息。
IoCreateDevice函数用于生成一个设备对象,一个驱动可以有多个设备对象。值得注意的是IoCreateDevice第二个参数可以指定设备扩展结构的大小。设备扩展是用户自定义的结构大小,保存在设备对象中。可以将相关的信息保存在其中而避免使用全局变量。
用户空间的程序可以通过符号链接来打开设备,而IoCreateSymbolicLink函数则是为设备名创建相应的符号链接。设备名只能是"\Device\xxxxx"这样的结构,而符号链接则可以是"\\.\xxxxxx"或者"\DosDevice\xxxxxx"这样的格式。
注意的一点是,在驱动中没有特殊情况的话,一般都使用Unicode字符。
在成功生成设备对象后,可以给驱动指定回调函数。在内核中驱动之间的信息是用IRP来传递的。可以将IRP视为Win32应用程序中的消息,而以下的代码:
pobj->MajorFunction[IRP_MJ_READ]=
pobj->MajorFunction[IRP_MJ_WRITE]=
pobj->MajorFunction[IRP_MJ_CREATE]=
pobj->MajorFunction[IRP_MJ_CLOSE]=MyDispath;
pobj->DriverUnload = MyUnload;
则跟MFC应用程序中的消息映射类似。
另外KdPrint宏则是用来输出调试信息的函数,跟DbgPrint类似,但在Free模式下编译的话则会被定义为空。
打开DebugView,随便找些东西将驱动加载了,就能看到输出的调试信息了。
分享到:
相关推荐
Railsガイドを読んで,误字・脱字・误訳などを见かけましたら,本リポジトリののにてお気軽に报告して顶けると幸いです。「Pull Requestを送ってみたい!」という场合は,下记の『 』を参照してください。 も
下层このリポジトリについてで利用するインフラ周りの管理をコード化しています。姫路IT系勉强会とは?は,兵库県姫路市を中心とした周辺地域のIT系技术者,Webデザイナー,学生,それらの技术に兴味を持つ人々が気...
imのリポジトリは岛根大学ものづくり部Pimのウェブアプリ开発勉强会のサンプルコードとして作成されました开催日:2019/6/30 Node.jsを用いたウェブアプリのサンプルですバックエンドにはExpressを,フロントエンド...
ruda的图片组合ルダの作品集をWEBサイトにて公开しております。...色んなモノやコトを勉强するのは大好きです。何か不具合・质问等ございましたらメール等でご连络ください。 (2020/12/22)ひとまず完成しました。
エンジニア勉强管理アプリ アプリの概要 エンジニアに关する勉强の状况を管理するアプリ 机能 以下の机能を有するアプリ ユーザー登录・ログイ...MySQLサーバーコマンド 起动・停止 mysql.server启动 mysql.server停止
真央ゼミWebサイト本リポジトリは勉强会での练习として使用するリポジトリです。ルリクエストを送ると,真央ゼミWebサイトの情报を追加更新できます。基本的には好きな内容を追加してOKですが,见た人が気分を害する...
今は少しサーバーサイドの勉强をしているので更新はあまりないかもしれません…上记ページは极力BootstrapやjQueryに頼らずに构筑することを目指して作成しました。使用ライブラリ等Sass(CSS管理の练习) swiper.js...
phina_samples を勉强しつつライブラリを充実させるて,最后にはゲームを作る予定 ...スプライトシートとアニメーション,当たり决定の制御のサンプルです。 既定クラス:SpriteCharBase 基本设定:SpriteCharSetting
git commitドでンドで,リポジトリのインデックスに追加された変更情报にコメントをつけてコミットできる git pushコマンドで,ローカルのコミットをリモートのリポジトリに反映させることができる
1のトライからダブル配列を作成する プログラムの実行方法 実行方法:python Main.py [数字]例:python Main.py 1 プログラムの说明 class Tester:初期化の际にファイルからデータを読み込む关数make_dic:辞书を...
このアプリでは,タイマー机能,チャート机能,カレンダー机能を使用できます。 はモドーロタイマーとは学习などのタスクを25分间続けた后に5分の休憩を取り,そのサイクルを最大4回続けるという时间管理术です。 ...
宿题アプリケーション1概要ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩保存成绩表示演示ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩表示2本番环境デプロイ先テストアカウントアドレスパ...
各ユーザーの「合计勉强时间」や「各科目の勉强时间」というデータを确认できます。 対に応いる人には,「いいね」して応援できます。(反対に応援されることも!) 投稿一覧ページ ユーザー详细ページ ンセプト 自...
(2012年4月-2020年3月)公务员として勤务(事务职)→退职(2020年4月-2020年12月)Webエンジニアへの転职を目指して勉强开始(2021年1月-现时点まで)Railsのバックエンジニアとして勤务中○アカウント○...
技术の技术书の共有をとおして初学者からベテランエンエニジニアまで全ての利用者のプログラミンミ学习グのオンラインラットフォームです。チャットでの交流もできるため,単なるレビューの阅覧以上の系がりが生まれ...
ユーザーは自分で英语の问题を作成できるし,他のユーザーが勉强になる问题を出してくれるくこーザーをフォローすれば,毎日良问を解くことができ,インプット的な学习もできます。 テーマを选んだ理由 英语を勉强す...
展开とは・ ・ ・ ReplicaSetの集合,ReplicaSetの世代管理ができる服务・ ・ ・外部公开,名前解决,L4ロードバランサーConfigMapとは・ ・ ・ Kubernetes上で利用する设定情报秘密とは・ ・ ・ Kubernetes上で...
やらかしてしまった时にはどのようにリカバリーできるかまで考えた上で行うこの注意事项は4月の半ばくらいまで贴っておくディレクトリの中身 genba_rails_summary 「现场で使えるRuby on Rails速修実践ガイド」の...
自述文件该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本系统依赖组态数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...
その后,基本情报技术者の午后问题で勉强ExcelVBA约1ヶ月入社时研修构架Ruby on Rails约4ヶ月でートフォリオにメインで使用jQuery查询--ポートフォリオに一部使用Vue.js --スクールカリキュラムRDB P