ورود

View Full Version : رفع اشکال جزئی در File System Driver



Veyskarami
چهارشنبه 05 بهمن 1390, 23:57 عصر
سلام دوستان
راستش یه درایور واسه نظارت روی عملکرد فایلها دانلود کردم ولی موقع اجرا یه ایراد کوچیک داره و اونم اینه که توی مسیری که تو خروجی dbgview دیدم اسم درایو وجود نداره مثلا مسیر "D:\test\a.txt" رو به صورت "test\a.txt\" نشون میده.

می خواستم از دوستانی که در زمینه درایور نویسی فعالیت می کنن بخوام که این قسمت رو به سورس اضافه کنن
ممنون .81476

r00tkit
جمعه 07 بهمن 1390, 19:12 عصر
سلام

WDK
رو نگاه کردی ؟



PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;

DbgPrint("%wZ\n", &pFileObject->FileName);


FILE_OBJECT.FileName;
اسم فایل رو می ده برای اینکه مسیر کامل رو گیر بیاری از ObQueryNameString استفاده کن

برای اینکه بدونی کی این درخواست رو کرده ( دستکاری فایل ) از IoGetRequestorProcess استفاده کن و بعد میتونی EPrOCRSS رو پارس کنی که مسیر کامل یا اسم پراسس مورد نظر رو گیر بیاری (البته راه های دیگه ای هم وجود داره که الان خاطرم نیست در کل برو دنبال minifilter )

این مثل codeproject فقط یه نکته جالب داشت ( یادش بخیر قدیما : ) )

پ.ن : http://www.jeyjey.blogfa.com/ :))))

Veyskarami
شنبه 08 بهمن 1390, 12:59 عصر
زیاد با سی سر و کله نزدم تازه واردم :D

ولی تا اینجا جلو رفتم

[

OBJECT_NAME_INFORMATION LocalNameInfo;
ULONG ReturnLength;


PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
ObQueryNameString(pFileObject,&LocalNameInfo,sizeof(LocalNameInfo),&ReturnLength);
DbgPrint("%wZ\n",&LocalNameInfo.Name);


ولی سیستم کرش کرد

r00tkit
شنبه 08 بهمن 1390, 13:07 عصر
معلومه باید کرش کنه باید قبلش مقدار مناسب براش pool بگیری

_OBJECT_NAME_INFORMATION
شامل یه عضو به UNICODE_STRING هستش با تعریف زیر


typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;



که عضو بافرش باید به جایی اشاره کنه شما فقط header رو ساختی .




nameBuffer = ExAllocatePool( NonPagedPool , 1024 ); //1024 is Microsoft's recommendation

if( imageFileObject == NULL )
{

return NULL;
}

// KeBugCheckEx( 5, (ULONG_PTR)4 , (ULONG_PTR)3 , (ULONG_PTR)2 , (ULONG_PTR)1 );

status = ObQueryNameString( imageFileObject, (POBJECT_NAME_INFORMATION)nameBuffer, 1024, &bytesWritten );


if( status != STATUS_INFO_LENGTH_MISMATCH && status != STATUS_SUCCESS )
{

return NULL;
}

if( status == STATUS_INFO_LENGTH_MISMATCH )
{
ExFreePool( nameBuffer );
nameBuffer = ExAllocatePool( NonPagedPool, bytesWritten );
ObQueryNameString( imageFileObject, (POBJECT_NAME_INFORMATION)nameBuffer, bytesWritten , &bytesWritten );
}


return (PUNICODE_STRING)nameBuffer;
}

Veyskarami
شنبه 08 بهمن 1390, 13:38 عصر
میشه کامل تر واسم بنویسی؟
dbgprint چی شد؟
اگه میشه کامل واسم بنویس تا آمارش دستم بیاد
مرسی

r00tkit
شنبه 08 بهمن 1390, 13:44 عصر
همین کدی رو که نوشتم return های null رو به Dbgprint تی که error می ده تبدیل کن و اخری رو به DbgPrint ای که بافر رو چاپ می کنه با همو %wz

imageFileObject
همون فایل ابجکت خودته
و
PVOID nameBuffer;



DbgPrint(" %wZ",(PUNICODE_STRING)nameBuffer);

Veyskarami
شنبه 08 بهمن 1390, 14:24 عصر
ممنون
کدی که گفتی به این شکل دراومد


OBJECT_NAME_INFORMATION LocalNameInfo;
ULONG ReturnLength;
PVOID nameBuffer;
NTSTATUS status;


PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
nameBuffer = ExAllocatePool( NonPagedPool , 1024 );

if( pFileObject == NULL )
{
return NULL;
}

status = ObQueryNameString( pFileObject, (POBJECT_NAME_INFORMATION)nameBuffer, 1024, &ReturnLength );

if( status != STATUS_INFO_LENGTH_MISMATCH && status != STATUS_SUCCESS )
{
return NULL;
}

if( status == STATUS_INFO_LENGTH_MISMATCH )
{
ExFreePool( nameBuffer );
nameBuffer = ExAllocatePool( NonPagedPool, ReturnLength );
ObQueryNameString( pFileObject, (POBJECT_NAME_INFORMATION)nameBuffer, ReturnLength , &ReturnLength );
}

DbgPrint(" %wZ",(PUNICODE_STRING)nameBuffer);




حالا فقط اسم درایو رو دارم اما بقیه مسیر رو چجوری به انتهای درایو باید اضافه کنم؟
با strcat زدم دوباره سیستم کرش شد اگه میشه تو این قسمت راهنماییم کن.

r00tkit
شنبه 08 بهمن 1390, 15:19 عصر
باید مسیر کامل رو می داد درکل
سرم شلوغه باید کد رو تست کنم ببینم چه خبره الان نمی تونم
بمونه بعدا در کل از گوگل هم استفاده کن چیز خوبیه