2005年05月07日

カーネルモードランタイムライブラリ

■リスト
 
 片方向リストの場合、リスト管理にPushEntryListとPopEntryListが使われる。

typedef struct _ONEWAY {
 ...
 SINGLE_LIST_ENTRY linkfield;
} ONEWAY, *PONEWAY;

SINGLE_LIST_ENTRY SingleHead;
SingleHead.Next = NULL;

PONEWAY psElement = (PONEWAY)ExAllocatePool(PagedPool,
 sizeof(ONEWAY));
PushEntryList(&SingleHead, &psElement->linkfield);

SINGLE_LIST_ENTRY psLink = PopEntryList(&SingleHead);
while (psLink) {
 psElement = CONTAINING_RECORD(psLink, ONEWAY, linkfield);
 ...
 ExFreePool(psElement);
 psLink = PopEntryList(&SingleHead);
}

 双方向リストの場合、関連関数にInitializeListHead、InsertHeadList、InsertTailList、IsListEmpty、RemoveEntryList、RemoveHeadList、RemoveTailListがある。

typedef struct _TWOWAY {
 ...
 LIST_ENTRY linkfield;
} TWOWAY, *PTWOWAY;

LIST_ENTRY DoubleHead;
InitializeListHead(&DoubleHead);
ASSERT(IsListEmpty(&DoubleHead));

PTWOWAY pdElement = (PTWOWAY)ExAllocatePool(PagedPool,
 sizeof(TWOWAY));
InsertTailList(&DoubleHead, &pdElement->linkfield);
...
if (!IsListEmpty(&DoubleHead)) {
 PLIST_ENTRY pdLink = RemoveHeadList(&DoubleHead);
 pdElement = CONTAINING_RECORD(pdLink, TWOWAY, linkfield);
 ...
 ExFreePool(pdElement);
}


■ルックアサイドリスト

 ルックアサイドリストを使用するとき、まずは、PAGED_LOOKASIDE_LISTかNPAGED_LOOKASIDE_LISTのオブジェクトをノンページドメモリから確保しなければならない。それは、ページングされるオブジェクトも、高いIRQLのもとでアクセスされる可能性があるからである。

PAGED_LOOKASIDE_LIST pagedlist;
PNPAGED_LOOKASIDE_LIST nonpagedlist;

ExInitializePagedLookasideList(pagedlist, Allocate, Free,
 0, blocksize, tag, 0);
ExInitializeNPagedLookasideList(nonpagedlist, Allocate, Free,
 0, blocksize, tag, 0);

PVOID p = ExAllocateFromPagedLookasideList(pagedlist);
PVOID q = ExAllocateFromNPagedLookasideList(nonpagedlist);

ExFreeToPagedLookasideList(pagedlist, p);
ExFreeToPagedLookasideList(nonpagedlist, q);

ExDeletePagedLookasideList(pagedlist);
ExDeleteNPagedLookasideList(nonpagedlist);




参考文献

1. Microsoft WDMプログラミング―WindowsXP対応
2.WindowsXPフィルタドライバプログラミング 入門と実践
3. WDMデバイスドライバプログラミング完全ガイド〈上〉
4. WDMデバイスドライバプログラミング完全ガイド〈下〉


blackcat_1973 at 20:32│Comments(0)TrackBack(0)ソフトウェア開発 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Profile
blackcat
スポンサー
訪問者数

QRコード
QRコード