青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

FileMon源碼學(xué)習(xí)筆記(二)

Posted on 2010-02-18 15:11 S.l.e!ep.¢% 閱讀(1765) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Windows WDM
FileMon源碼學(xué)習(xí)筆記(二)
2008-11-24 10:41

FileMon源碼中另一個(gè)比較疑惑的地方,F(xiàn)ileMon創(chuàng)建了兩類(lèi)設(shè)備,一個(gè)是用于和ring3通信的GUI設(shè)備,另一個(gè)是hook的過(guò)濾設(shè)備,但在代碼中,當(dāng)收到發(fā)向GUI設(shè)備的IRP_MJ_DEVICE_CONTROL時(shí),代碼竟是去調(diào)用屬于hook設(shè)備的功能函數(shù),而在這個(gè)功能函數(shù)里面通過(guò)條件判斷是否是GUI設(shè)備來(lái)分別處理,而對(duì)于發(fā)給GUI設(shè)備的其他IRP都在直接在GUI的處理函數(shù)中直接處理的,不知道作者這樣寫(xiě)是否有什么深層的含義,不過(guò)對(duì)于我這種初學(xué)者來(lái)說(shuō),這樣的寫(xiě)法倒是容易引起混亂,還是不同設(shè)備的功能函數(shù),分開(kāi)來(lái)寫(xiě)好一點(diǎn)。下面附上相關(guān)代碼:

//=========================================================

//GUI設(shè)備的功能函數(shù),注意IRP_MJ_DEVICE_CONTROL的實(shí)現(xiàn)

//=========================================================

NTSTATUS
FilemonDeviceRoutine(
??? IN PDEVICE_OBJECT DeviceObject,
??? IN PIRP Irp
??? )
{
??? PIO_STACK_LOCATION irpStack;
??? PVOID?????????????? inputBuffer;
??? PVOID?????????????? outputBuffer;
??? ULONG?????????????? inputBufferLength;
??? ULONG?????????????? outputBufferLength;
??? ULONG?????????????? ioControlCode;

??? //
??? // Go ahead and set the request up as successful
??? //
??? Irp->IoStatus.Status????? = STATUS_SUCCESS;
??? Irp->IoStatus.Information = 0;

??? //
??? // Get a pointer to the current location in the Irp. This is where
??? // the function codes and parameters are located.
??? //
??? irpStack = IoGetCurrentIrpStackLocation (Irp);

??? //
??? // Get the pointer to the input/output buffer and its length
??? //
??? inputBuffer??????? = Irp->AssociatedIrp.SystemBuffer;
??? inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
??? outputBuffer?????? = Irp->AssociatedIrp.SystemBuffer;
??? outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
??? ioControlCode????? = irpStack->Parameters.DeviceIoControl.IoControlCode;

??? switch (irpStack->MajorFunction) {
??? case IRP_MJ_CREATE:

??????? DbgPrint(("Filemon: IRP_MJ_CREATE\n"));

??????? //
??????? // Start the sequence number at 0
??????? //
??????? Sequence = 0;
??????? break;

??? case IRP_MJ_CLOSE:

??????? DbgPrint(("Filemon: IRP_MJ_CLOSE\n"));

??????? //
??????? // A GUI is closing communication
??????? //
??????? FilterOn = FALSE;

??????? //
??????? // If the GUI has no more references to us, reset the output
??????? // buffers and hash table.
??????? //
??????? FilemonResetLog();
??????? FilemonHashCleanup();

??????? //
??????? // Stop capturing drives
??????? //
??????? HookDriveSet( 0, DeviceObject->DriverObject );
??????? UnhookSpecialFs( NPFS );
??????? UnhookSpecialFs( MSFS );
??????? break;

??? case IRP_MJ_DEVICE_CONTROL:

??????? //
??????? // This path will never execute because we have registered a
??????? // fast I/O path for device control. That means that the fast I/O entry
??????? // point will ALWAYS be called for Device Control operations
??????? //
??????? DbgPrint (("Filemon: IRP_MJ_DEVICE_CONTROL\n"));

??????? //
??????? // Get output buffer if its passed as an MDL
??????? //
??????? if( Irp->MdlAddress ) {

??????????? outputBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
??????? }

??????? //
??????? // Its a request from the GUI. Simply call our fast handler.
??????? //
??????? FilemonFastIoDeviceControl( irpStack->FileObject, TRUE,
??????????????????????????????????? inputBuffer, inputBufferLength,
??????????????????????????????????? outputBuffer, outputBufferLength,
??????????????????????????????????? ioControlCode, &Irp->IoStatus, DeviceObject );
??????? break;
??? }

??? //
??? // Complete the IRP
??? //
??? IoCompleteRequest( Irp, IO_NO_INCREMENT );
??? return STATUS_SUCCESS;??
}

//=========================================================

//hook設(shè)備的功能函數(shù),在里面夾雜了處理GUI設(shè)備的IRP_MJ_DEVICE_CONTROL的代碼

//=========================================================
BOOLEAN
FilemonFastIoDeviceControl(
??? IN PFILE_OBJECT FileObject,
??? IN BOOLEAN Wait,
??? IN PVOID InputBuffer,
??? IN ULONG InputBufferLength,
??? OUT PVOID OutputBuffer,
??? IN ULONG OutputBufferLength,
??? IN ULONG IoControlCode,
??? OUT PIO_STATUS_BLOCK IoStatus,
??? IN PDEVICE_OBJECT DeviceObject
??? )
{
??? BOOLEAN???????????? retval = FALSE;
??? BOOLEAN???????????? logMutexReleased;
??? PHOOK_EXTENSION???? hookExt;
??? PLOG_BUF??????????? oldLog, savedCurrentLog;
??? CHAR??????????????? fullPathName[MAXPATHLEN], name[PROCNAMELEN], errorBuf[ERRORLEN];
??? KIRQL?????????????? oldirql;
??? LARGE_INTEGER?????? timeStampStart, timeStampComplete, timeResult;
??? LARGE_INTEGER?????? dateTime;

??? hookExt = DeviceObject->DeviceExtension;
??? if( hookExt->Type == GUIINTERFACE ) {

??????? //
??????? // Its a message from our GUI!
??????? //
??????? IoStatus->Status????? = STATUS_SUCCESS; // Assume success
??????? IoStatus->Information = 0;????? // Assume nothing returned

??????? switch ( IoControlCode ) {

??????? case IOCTL_FILEMON_VERSION:

??????????? //
??????????? // Version #
??????????? //
??????????? if( OutputBufferLength >= sizeof(ULONG)) {

??????????????? *(ULONG *)OutputBuffer = FILEMONVERSION;
??????????????? IoStatus->Information = sizeof(ULONG);

??????????? } else {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????? }???????????
??????????? break;

??????? case IOCTL_FILEMON_SETDRIVES:

??????????? //
??????????? // Hook and/or unhook drives
??????????? //
??????????? DbgPrint (("Filemon: set drives\n"));

??????????? if( InputBufferLength >= sizeof(ULONG) &&
???????????????? OutputBufferLength >= sizeof(ULONG)) {

??????????????? *(ULONG *)OutputBuffer = HookDriveSet( *(ULONG *)InputBuffer, DeviceObject->DriverObject );
??????????????? IoStatus->Information = sizeof(ULONG);

??????????? } else {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????? }
??????????? break;

??????? case IOCTL_FILEMON_HOOKSPECIAL:

??????????? if( InputBufferLength >= sizeof(FILE_SYSTEM_TYPE )) {

??????????????? if( !HookSpecialFs( DeviceObject->DriverObject, *(PFILE_SYSTEM_TYPE) InputBuffer )) {
???????????????
??????????????????? IoStatus->Status = STATUS_UNSUCCESSFUL;
??????????????? }
??????????? } else {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????? }
??????????? break;

??????? case IOCTL_FILEMON_UNHOOKSPECIAL:

??????????? if( InputBufferLength >= sizeof(FILE_SYSTEM_TYPE )) {

??????????????? UnhookSpecialFs( *(PFILE_SYSTEM_TYPE) InputBuffer );

??????????? } else {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????? }
??????????? break;

??????? case IOCTL_FILEMON_STOPFILTER:
???????????
??????????? //
??????????? // Turn off logging
??????????? //
??????????? DbgPrint(("Filemon: stop logging\n"));
??????????? FilterOn = FALSE;
??????????? break;

??????? case IOCTL_FILEMON_STARTFILTER:
?????????
??????????? //
??????????? // Turn on logging
??????????? //
??????????? DbgPrint(("Filemon: start logging\n"));
??????????? FilterOn = TRUE;
??????????? break;

??????? case IOCTL_FILEMON_SETFILTER:

??????????? //
??????????? // Gui is updating the filter functions
??????????? //
??????????? DbgPrint(("Filemon: set filter\n"));

??????????? if( InputBufferLength >= sizeof(FILTER) ) {

??????????????? FilterDef = *(PFILTER) InputBuffer;
??????????????? FilemonUpdateFilters();

??????????? } else {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????? }
??????????? break;

??????? case IOCTL_FILEMON_UNLOADQUERY:
#if DBG
??????????? //
??????????? // Is it possible to unload?
??????????? //
??????????? KeAcquireSpinLock( &CountMutex, &oldirql );
??????????? IoStatus->Information = OutstandingIRPCount;

??????????? //
??????????? // Any outstanding Irps?
??????????? //
??????????? if( !OutstandingIRPCount ) {

??????????????? //
??????????????? // Nope, so don't process anymore
??????????????? //
??????????????? UnloadInProgress = TRUE;

??????????????? KeReleaseSpinLock( &CountMutex, oldirql );

??????????????? //
??????????????? // Stop capturing drives
??????????????? //
??????????????? HookDriveSet( 0, DeviceObject->DriverObject );
??????????????? UnhookSpecialFs( NPFS );
??????????????? UnhookSpecialFs( MSFS );

??????????????? //
??????????????? // Detach from all devices
??????????????? //
??????????????? UnloadDetach();

??????????? } else {

??????????????? KeReleaseSpinLock( &CountMutex, oldirql );
??????????? }
#else // DBG
??????????? IoStatus->Information = 1;
#endif // DBG
??????????? break;

??????? case IOCTL_FILEMON_ZEROSTATS:

??????????? //
??????????? // Reset all output buffers
??????????? //
??????????? DbgPrint (("Filemon: zero stats\n"));

??????????? ExAcquireFastMutex( &LogMutex );

??????????? while( CurrentLog->Next ) {

??????????????? //
??????????????? // Free all but the first output buffer
??????????????? //
??????????????? oldLog = CurrentLog->Next;
??????????????? CurrentLog->Next = oldLog->Next;

??????????????? ExFreePool( oldLog );
??????????????? NumLog--;
??????????? }

??????????? //
??????????? // Set the output pointer to the start of the output buffer
??????????? //
??????????? CurrentLog->Len = 0;
??????????? Sequence = 0;

??????????? ExReleaseFastMutex( &LogMutex );
??????????? break;

??????? case IOCTL_FILEMON_GETSTATS:

??????????? //
??????????? // Copy the oldest output buffer to the caller
??????????? //
??????????? DbgPrint (("Filemon: get stats\n"));

??? //
??????????? // If the output buffer is too large to fit into the caller's buffer
??????????? //
??????????? if( LOGBUFSIZE > OutputBufferLength ) {

??????????????? IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
??????????????? return FALSE;
??????????? }

??????????? //
??????????? // Probe the output buffer
??????????? //
??????????? try {????????????????

??????????????? ProbeForWrite( OutputBuffer,
?????????????????????????????? OutputBufferLength,
?????????????????????????????? sizeof( UCHAR ));

??????????? } except( EXCEPTION_EXECUTE_HANDLER ) {

??????????????? IoStatus->Status = STATUS_INVALID_PARAMETER;
??????????????? return FALSE;
??????????? }???????????

??????????? //
??????????? // We're okay, lock the buffer pool
??????????? //
??????????? ExAcquireFastMutex( &LogMutex );
??????????? if( CurrentLog->Len || CurrentLog->Next ) {

??????????????? //
??????????????? // Start output to a new output buffer
??????????????? //
??????????????? FilemonAllocateLog();

??????????????? //
??????????????? // Fetch the oldest to give to user
??????????????? //
??????????????? oldLog = FilemonGetOldestLog();

??????????????? if( oldLog != CurrentLog ) {

??????????????????? logMutexReleased = TRUE;
??????????????????? ExReleaseFastMutex( &LogMutex );

??????????????? } else {

??????????????????? logMutexReleased = FALSE;
??????????????? }

??????????????? //
??????????????? // Copy it to the caller's buffer
??????????????? //
??????????????? memcpy( OutputBuffer, oldLog->Data, oldLog->Len );

??????????????? //
??????????????? // Return length of copied info
??????????????? //
??????????????? IoStatus->Information = oldLog->Len;

??????????????? //
??????????????? // Deallocate buffer - unless its the last one
??????????????? //
??????????????? if( logMutexReleased ) {
???????????????????
??????????????????? ExFreePool( oldLog );

??????????????? } else {

??????????????????? CurrentLog->Len = 0;
??????????????????? ExReleaseFastMutex( &LogMutex );???????????????????
??????????????? }

??????????? } else {

??????????????? //
??????????????? // There is no unread data
??????????????? //
??????????????? ExReleaseFastMutex( &LogMutex );
???? IoStatus->Information = 0;
??????????? }
??????????? break;

??????? default:

??????????? //
??????????? // Unknown control
??????????? //
??????????? DbgPrint (("Filemon: unknown IRP_MJ_DEVICE_CONTROL\n"));
??????????? IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
??????????? break;
??????? }

??????? retval = TRUE;

??? } else {

??????? //
??????? // Its a call for a file system, so pass it through
??????? //
??????? if( FASTIOPRESENT( hookExt, FastIoDeviceControl ) ) {
???????
??????????? FilemonGetFullPath( FALSE, FileObject, hookExt, fullPathName );
??????????? TIMESTAMPSTART();

??????????? retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoDeviceControl(
??????????????? FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer,
??????????????? OutputBufferLength, IoControlCode, IoStatus, hookExt->FileSystem );

??????????? if(hookExt->Hooked) {

??????????????? TIMESTAMPSTOP();
??????????????? LogRecord( TRUE, NULL, &dateTime, &timeResult,
?????????????????????????? "%s\tFASTIO_DEVICE_CONTROL\t%s\tIOCTL: 0x%X\t%s",
?????????????????????????? FilemonGetProcess( name ), fullPathName,
?????????????????????????? IoControlCode,
?????????????????????????? retval ? ErrorString( IoStatus->Status, errorBuf ) : "FAILURE" );
??????????? }
??????? }
??? }

??? return retval;
}

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线日韩电影| 欧美一区二区三区男人的天堂 | 国产一区二区三区免费不卡| 激情久久久久久久久久久久久久久久| 亚洲黄色成人网| 亚洲一区激情| 美女成人午夜| 一本色道久久加勒比精品| 香蕉久久国产| 欧美成人在线网站| 国产精品久久久久久超碰| 韩国av一区二区三区| 亚洲老司机av| 欧美一区二区黄色| 欧美ed2k| aa级大片欧美| 久久久免费精品视频| 欧美日本精品在线| 激情六月婷婷综合| 亚洲小视频在线观看| 久久久久久网址| 日韩图片一区| 浪潮色综合久久天堂| 欧美四级伦理在线| 亚洲激情女人| 久久精品99| 一本久久a久久精品亚洲| 久久久一区二区三区| 国产精品成人国产乱一区| 亚洲第一天堂av| 亚洲欧美日韩在线播放| 欧美成人r级一区二区三区| 亚洲欧美一区二区视频| 欧美片网站免费| 在线国产欧美| 久久国产一区二区三区| 99精品黄色片免费大全| 久久躁狠狠躁夜夜爽| 国产欧美精品在线观看| 一区二区三区日韩欧美精品| 欧美gay视频激情| 欧美一级久久久久久久大片| 国产精品第十页| 亚洲最新视频在线播放| 免费的成人av| 久久gogo国模啪啪人体图| 国产精品日韩专区| 一本高清dvd不卡在线观看| 蜜臀99久久精品久久久久久软件| 亚洲视频福利| 欧美日韩激情小视频| 亚洲欧洲美洲综合色网| 麻豆精品在线观看| 欧美专区亚洲专区| 国产亚洲成人一区| 欧美一区二区三区视频| 亚洲影音先锋| 国产精品看片资源| 亚洲性xxxx| 一区二区毛片| 国产精品www网站| 一区二区三欧美| 亚洲精品欧美极品| 猫咪成人在线观看| 亚洲国产精品成人精品| 久久久久久久综合日本| 亚洲欧美国产精品va在线观看| 欧美性做爰毛片| 国产精品99久久久久久www| 亚洲精品美女在线观看| 欧美国产91| 亚洲美女色禁图| 亚洲巨乳在线| 欧美午夜www高清视频| 亚洲自拍偷拍一区| 亚洲专区免费| 国产一区二区欧美日韩| 久久人91精品久久久久久不卡| 欧美一级大片在线免费观看| 国精产品99永久一区一区| 久久久久91| 久久婷婷蜜乳一本欲蜜臀| 红桃视频一区| 欧美电影美腿模特1979在线看| 裸体女人亚洲精品一区| 亚洲第一精品福利| 91久久久久久久久| 欧美三区在线视频| 午夜精品视频在线观看| 亚久久调教视频| 在线不卡视频| 亚洲区一区二区三区| 国产精品高潮粉嫩av| 久久精品1区| 男人的天堂亚洲在线| a91a精品视频在线观看| 亚洲一区二区不卡免费| 黄色在线一区| 亚洲日韩中文字幕在线播放| 国产精品电影在线观看| 久久久久久久久蜜桃| 免费精品视频| 亚洲伊人一本大道中文字幕| 欧美一级网站| 亚洲精品乱码久久久久久日本蜜臀| 日韩午夜剧场| 韩国三级电影一区二区| 亚洲经典三级| 国产欧美精品| 欧美激情一区二区三区在线视频| 欧美视频网址| 麻豆精品网站| 欧美午夜美女看片| 麻豆成人在线播放| 欧美日韩一区二区国产| 久久免费国产| 欧美日韩视频在线| 久久综合九色综合欧美就去吻| 欧美日本亚洲视频| 久久免费一区| 欧美三级乱码| 欧美~级网站不卡| 国产精品日韩专区| 亚洲国产岛国毛片在线| 国产一级揄自揄精品视频| 91久久精品日日躁夜夜躁欧美| 国产亚洲欧美另类中文| 亚洲美女福利视频网站| 一区二区三区亚洲| 在线一区二区日韩| 亚洲国产三级| 午夜国产精品视频免费体验区| 亚洲美女黄网| 久久伊人精品天天| 欧美一区二区在线| 欧美日韩国产一区精品一区| 噜噜噜在线观看免费视频日韩| 国产精品videosex极品| 欧美激情亚洲精品| 国产原创一区二区| 亚洲一区二区视频在线| 99精品视频免费在线观看| 久久久精品欧美丰满| 欧美亚洲视频在线看网址| 欧美巨乳在线| 欧美激情1区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲网址在线| 在线视频一区二区| 久久综合给合久久狠狠色| 久久精品道一区二区三区| 国产精品久久久久久亚洲调教 | 亚洲裸体在线观看| 久久久蜜桃精品| 久久久久久久尹人综合网亚洲| 国产精品magnet| 亚洲精品久久在线| 91久久精品网| 免费在线播放第一区高清av| 久久久欧美精品| 国产日韩在线播放| 亚洲一区高清| 亚洲欧美成人在线| 欧美视频在线观看视频极品 | 99精品99久久久久久宅男| 最新国产の精品合集bt伙计| 久久久精品2019中文字幕神马| 久久精彩视频| 国产一区91精品张津瑜| 午夜在线精品偷拍| 欧美中文在线免费| 国产情侣久久| 欧美一区二区三区在线免费观看 | 亚洲免费在线电影| 午夜精品久久| 国产精品久久久久久户外露出| 日韩亚洲在线观看| 亚洲视频在线观看| 国产精品白丝av嫩草影院| av成人免费观看| 亚洲伊人观看| 国产免费亚洲高清| 性做久久久久久久久| 久久精品一区二区三区中文字幕| 国产区欧美区日韩区| 欧美一级黄色网| 猛男gaygay欧美视频| 在线成人av.com| 蜜桃伊人久久| 亚洲精品久久| 亚洲一区二区三区视频播放| 国产精品第13页| 香蕉久久一区二区不卡无毒影院| 久久精品人人做人人爽| 韩国一区电影| 欧美a级片一区| 夜夜狂射影院欧美极品| 欧美亚洲日本一区| 黑人极品videos精品欧美裸| 老司机免费视频一区二区|