#pragma warning(disable : 4100) #include <ntddk.h> NTSTATUS CreateDirectory() { UNICODE_STRING dirPath; OBJECT_ATTRIBUTES objAttr; HANDLE hDir = NULL; IO_STATUS_BLOCK ioStatus; NTSTATUS status; // مسیر فولدر (NT Path) RtlInitUnicodeString(&dirPath, L"\\??\\C:\\KernelTest"); InitializeObjectAttributes( &objAttr, &dirPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL ); status = ZwCreateFile( &hDir, FILE_LIST_DIRECTORY | SYNCHRONIZE, &objAttr, &ioStatus, NULL, FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_CREATE, // اگر نبود بساز FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if (NT_SUCCESS(status)) { ZwClose(hDir); DbgPrintEx(0, 0, "Directory created successfully!\n"); } else { DbgPrintEx(0, 0, "Failed to create directory: 0x%X\n", status); } return status; } NTSTATUS UnloadDriver(PDRIVER_OBJECT DriverObject) { DbgPrintEx(0, 0, "Driver unloaded\n"); return STATUS_SUCCESS; } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); DriverObject->DriverUnload = UnloadDriver; DbgPrintEx(0, 0, "Driver loaded\n"); CreateDirectory(); return STATUS_SUCCESS; }
نکته مهم (خیلی مهم)
در کرنل:
نباید از مسیرهای Win32 مثل C:\... مستقیم استفاده کنی
باید از مسیر NT استفاده شود:
\??\C:\KernelTest
این کد دقیقاً چه میکند؟
مسیر فولدر:
L"\\??\\C:\\KernelTest"
\\??\\ → فضای نام NT
C: → درایو
KernelTest → فولدر
ZwCreateFile
در کرنل:
هم برای فایل
هم برای دایرکتوری
استفاده میشود.
فلگ مهم:
FILE_DIRECTORY_FILE
یعنی این object یک فولدر است.
همان گونه که در قسمت های قبل درایور رو ساخت و اجرا و ... میکردم درایور رو اجرا میکنیم.
قبل از اجرای درایور:

بعد از اجرای درایور:

Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com