g_pmdlSystemCall := MmCreateMdl(nil, lpKeServiceDescriptorTable^.ServiceTableBase, lpKeServiceDescriptorTable^.NumberOfServices * 4); if g_pmdlSystemCall = nil then begin Result := STATUS_UNSUCCESSFUL; Exit; end;
MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
g_pmdlSystemCall^.MdlFlags := g_pmdlSystemCall^.MdlFlags or MDL_MAPPED_TO_SYSTEM_VA;
السؤال هنا أن صاحب الموضوع و المشاركين نجحو في تشغيله دون Bsod
على عكسي :frusty: لدا أعدة مراجعه الموضوع, هل من الممكن :
الداكرة المخصصة لـ SSDT داكرة للقراءة فقط , و نحن نريد التغير في مسار الإستدعاء :crazy:؟؟.
اظن ان المشكل سببه الــ Kit التي تستعمل في انتاج الدرايفر !
حمل آخر اصدار للــ Kit من الموقع الرسمي ثم حاول من جديد، انتبه فقط لمسارات MakeFile التي يجب ان توجهك الى الــ Kit الجديدة و ليس مسار الــ Kit التي عندك...
كيفية التعامل مع المرفق:
المرفق يحتوي على : ملف مصدري -الذي وضعته في مشاركتك-، الدرايفر المنتج عندي و ملف Object هذا الأخير له دور آخر...
1- حاول تسجيل و تحميل الدرايفر المرفق.
2- ضع ملف Object بجانب الملف المصدري و قم بعمل درايفر جديد في جهازك، عملية الانتاج ستأخذ ملف Object المرفق لبناء الدرايفر دون استعمال الذي في جهازك.
جرب هذه العمليات قبل ان تستعمل الــ Kit الموجودة في الموقع الرسمي، و اخبرني...
إقتباس :الداكرة المخصصة لـ SSDT داكرة للقراءة فقط , و نحن نريد التغير في مسار الإستدعاء ؟؟
بخصوص هذا التعجب سنجيب عليه ان شاء الله في آخر مراحل اكتمال المشروع، الآن يجب ان ننتهي من معالجة الأخطاء الأولية الخاصة بكتابة الأوامر و غيرها...
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
implementation
var DeviceName, SymbolicLinkName: UNICODE_STRING;
//********************************************************************************// Function Example_IsStringTerminated(pString:PAnsiChar; uiLength: ULONG):Boolean; stdCall; var bStringIsTerminated:Boolean; uiIndex:ULONG; begin bStringIsTerminated:= False; uiIndex := 0; { here, uiIndex must be initialized! } while(uiIndex < uiLength) and (bStringIsTerminated = False) do begin if pString[uiIndex] = #0 then bStringIsTerminated := True else Inc(uiIndex); end; Result:= bStringIsTerminated; end;
function MmGetSystemAddressForMdlSafe(MDL: PMDL; PRIORITY: DWORD): PVOID; begin if ((MDL^.MdlFlags and (MDL_MAPPED_TO_SYSTEM_VA or MDL_SOURCE_IS_NONPAGED_POOL)) <> 0) then Result := MDL^.MappedSystemVa else Result := MmMapLockedPagesSpecifyCache(MDL, KernelMode, MmCached, nil, 0, PRIORITY); end;
RtlInitUnicodeString(UNICODESTRING,pWDB); InitializeObjectAttributes(obj, @UNICODESTRING, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, 0, nil); Rslt := ZwDeleteFile(@obj); if Rslt = STATUS_SUCCESS then begin DbgPrint('File deleted sucessfully - Result:0x%.8X', Rslt); end else begin DbgPrint('Fail to delete file - Result:0x%.8X', Rslt); DbgPrint('Object name :%wZ', obj.ObjectName); end; End;
function WriteDispatch(DeviceObject: PDEVICE_OBJECT;Irp: PIRP):NTSTATUS;stdcall; var pIoStackIrp :PIO_STACK_LOCATION ; pWriteDataBuffer: PAnsiChar ; begin DbgPrint('DirectIO: WriteDispatch'#13#10); pWriteDataBuffer := nil; pIoStackIrp := IoGetCurrentIrpStackLocation(Irp); if pIoStackIrp <> nil then begin if Irp^.MdlAddress <> nil then pWriteDataBuffer:= MmGetSystemAddressForMdlSafe(Irp^.MdlAddress, NormalPagePriority) else pWriteDataBuffer := Irp^.UserBuffer; if pWriteDataBuffer <> nil then if Example_IsStringTerminated(pWriteDataBuffer, pIoStackIrp^.Parameters.Write.Length) then Begin DbgPrint('File Req To Deleted ? : %s'#13#10, pWriteDataBuffer); DeleteFileReq (PwideChar('\??\' + pWriteDataBuffer)); End; end; Irp^.IoStatus.Status:= STATUS_SUCCESS; Irp^.IoStatus.Information:= 0; IoCompleteRequest(IRP,IO_NO_INCREMENT); Result:=STATUS_SUCCESS; end;
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall; var pDeviceObject: TDeviceObject; begin DbgPrint('Driver :: Loaded'#13#10); RtlInitUnicodeString(DeviceName, '\Device\ZwDeleteFileFromRing3'); RtlInitUnicodeString(SymbolicLinkName, '\??\DirectIO'); Result:=IoCreateDevice(DriverObject, 0, @DeviceName, FILE_DEVICE_UNKNOWN,0, False, pDeviceObject); if Result = STATUS_SUCCESS then begin if (IoCreateSymbolicLink(@SymbolicLinkName, @DeviceName) = STATUS_SUCCESS) then begin DriverObject^.MajorFunction[IRP_MJ_CREATE] := @CreateCloseDispatch; DriverObject^.MajorFunction[IRP_MJ_CLOSE] := @CreateCloseDispatch; DriverObject^.MajorFunction[IRP_MJ_WRITE] := @WriteDispatch; DriverObject^.DriverUnload := @DriverUnload; end else begin DbgPrint('IoCreateSymbolicLink fail!'#13#10); IoDeleteDevice(@pDeviceObject); end; end else DbgPrint('IoCreateDevice Fail!'#13#10); result := STATUS_SUCCESS;
end;
end.
هنا أقع في Bsod لمادا لأني لم أعرف كيف أظيف '\??\' للمسار الممر من الـ UserMode
هل من طريقة لدمج '\??\' مع المسار آليا .
1- لا قمت بكتابتها .. المشكل كما قلت لك لم أعرف كيف أظيف '\??\' للمسار الممر من الـ UserMode
فهو دريفر بسيط يقوم بحدف الملف الدي نحدده من الـ Kernel ؟؟ .
2- أنا أستعمل VMWare لم أنجح في تحميل الدريفر فيه نفس الدريفرالدي قمت أنت بإرفاقه.
إقتباس :اظن ان المشكل سببه الــ Kit التي تستعمل في انتاج الدرايفر ! حمل آخر اصدار للــ Kit من الموقع الرسمي ثم حاول من جديد، انتبه فقط لمسارات MakeFile التي يجب ان توجهك الى الــ Kit الجديدة و ليس مسار الــ Kit التي عندك...
هذا الحل الذي اقترحته عليك في المشاركة السابقة...
إقتباس :تم حل المشكلة , ببساطة جربته في Real M
عادي لكن عند تحميله في الـ Virtual Machine أتحصل على Bsod .
و هذا هو ردك هنا...
إقتباس :mickeylan Thank you for your interest !
i fixed the problem , it just"Kmdkit" UpDate , Because I used old Version !
و هذا ردك لنفس السؤال الذي طرحته في منتدى صاحب الــ Kit.