نواة برنامج تشغيل وضع الكتابة إلى ملف
سؤال
وأنا أعمل على برنامج تشغيل عامل تصفية ويندوز لوحة المفاتيح ولست بحاجة لكتابة إلى ملف. حاولت استخدام zwcreate، zwwrite، وzwclose لكن السائق لم يكن قيد التشغيل في PASSIVE_LEVEL وحصلت على الموت الزرقاء. لم يسبق لي أن كتبت سائق ويندوز من قبل. شكرا للمساعدة!
وتحرير: شكرا لك J. اجتياز
المحلول
جدول workitems (IoAllocateWorkItem / IoQueueWorkItem) والتعامل مع كل ملف I / O من داخل إجراءات workitem رد.
<اقتباس فقرة>ولست متأكدا إذا كان فكرة جيدة للسماح للكتابة سائق النواة إلى ملف في المقام الأول. أفضل طريقة للقيام بذلك IMHO هو توفير برنامج الفضاء المستخدم الذي يتصل مع السائق، يحصل على البيانات ومن ثم يكتب إلى القرص.
اقتباس فقرة>وهذا صحيح ليونكس، ولكن ليس ويندوز.
نصائح أخرى
وهناك مثال رائع لاستخدام ZW-أدوات لكتابة الملفات من تشغيل الجهاز هو جدت Klog Clandestiny في الموقع rootkit.com . أنها تساعد حاليا لي الكثير.
وكذلك، أنا أوافق نوعا ما مع يوهانس أنه ليس من المستحسن أن تفعل الكلاسيكية يوزرلاند العمل (ملف / صافي /...- الوصول) مباشرة من السائق. ليس فقط لأنه errorprone، بل هو أيضا قد كسر unforseeable في المستقبل. واجهات المستخدم وأكثر استقرارا بكثير ومرنة بشكل طبيعي.
PCUCHAR buffer[] = {0x00, 0x01, 0x02, 0x03}; // for example
ULONG bufferSize = sizeof(buffer);
UNICODE_STRING filePath; // Must be with DOS prefix: \??\C:\MyFolder\logs.txt
HANDLE hFile;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
InitializeObjectAttributes(&ObjectAttributes, &filePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
NTSTATUS Status = ZwCreateFile(&hFile, FILE_GENERIC_READ | FILE_GENERIC_WRITE, &ObjectAttributes,
&IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE,
FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
if (!NT_SUCCESS(Status))
{
DbgPrint("[DRV_NAME]: Creating file error");
return Status;
}
Status = ZwWriteFile(hFile, NULL, NULL, NULL, &IoStatusBlock, (PVOID)buffer, bufferSize, NULL, NULL);
if (!NT_SUCCESS(Status))
{
InjDbgPrint("[DRV_NAME]: Writing file error");
return Status;
}
ZwClose(hFile);