Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results
Hello ,
i developped a driver filesystem with mup function which work good ! BUT
it is correct code on SECTION STATUS_REPARSE ?
If no correct , then How do i work for good correct ?
Thank.
`
NTSTATUS drvdispatchmupdisk(PDEVICE_EXTENSION_MOTHER mu, PIRP Irp, PIO_STACK_LOCATION irps)
{
//PDEVICE_EXTENSION_MOTHER mu = (PDEVICE_EXTENSION_MOTHER)DeviceObject->DeviceExtension;
NTSTATUS ret = STATUS_INVALID_DEVICE_REQUEST;
if (irps->MajorFunction == IRP_MJ_CREATE)
{
fileObject = irps->FileObject;
if (fileObject == NULL) { KdPrintfSure2(("[MUP] fileObject == NULL\n")); ret = STATUS_INVALID_PARAMETER; goto GGGH; } pSIn = &(fileObject->FileName);
...
...
if (ISUNCREGISTERED(mu, source, &LEN, wchemin, &flagunc) == TRUE)
{
...
...
dest[0] = 0;
{ wcscat(dest, wchemin); } wcscat(dest, L"\\"); if ((flagunc&FL_UNC_ADDPATHUNC) != FL_UNC_ADDPATHUNC) wcscat(dest, source + LEN); else wcscat(dest, source); KdPrintfSure2(("IRP_MJ_CREATE %ws devient %ws\n", source, dest)); UNICODE_STRING SOut; SOut.MaximumLength = 4096; ret = SimRepAllocateUnicodeString(&SOut); if (ret == STATUS_SUCCESS) { SOut.Length = wcslen(dest) << 1; RtlCopyMemory(SOut.Buffer, dest, SOut.Length); NRedSwapUnicodeString(pSIn, &SOut); SimRepFreeUnicodeString(&SOut); KDPublic(("File %ws matched\n", source)); ret = STATUS_REPARSE; }
...
...
}
VOID
NRedSwapUnicodeString(
__in __out PUNICODE_STRING p1,
__in __out PUNICODE_STRING p2
)
{
UNICODE_STRING tmp;
//PAGED_CODE(); tmp.Length = p1->Length; tmp.MaximumLength = p1->MaximumLength; tmp.Buffer = p1->Buffer; p1->Length = p2->Length; p1->MaximumLength = p2->MaximumLength; p1->Buffer = p2->Buffer; p2->Length = tmp.Length; p2->MaximumLength = tmp.MaximumLength; p2->Buffer = tmp.Buffer;
}
NTSTATUS
SimRepAllocateUnicodeString(
PUNICODE_STRING String
)
{
PAGED_CODE(); String->Buffer = (PWCH) ExAllocatePool( PagedPool, String->MaximumLength ); if (String->Buffer == NULL) { /*DDbgPrint("[SimRep]: Failed to allocate unicode string of size 0x%x\n", String->MaximumLength); */ return STATUS_INSUFFICIENT_RESOURCES; } String->Length = 0; return STATUS_SUCCESS;
}
VOID
SimRepFreeUnicodeString(
PUNICODE_STRING String
)
{
PAGED_CODE();
if (String->Buffer) { ExFreePool(String->Buffer); String->Buffer = NULL; } String->Length = String->MaximumLength = 0; String->Buffer = NULL;
}
`
It looks like you're new here. If you want to get involved, click one of these buttons!
Upcoming OSR Seminars | ||
---|---|---|
Writing WDF Drivers | 21 Oct 2019 | OSR Seminar Space & ONLINE |
Internals & Software Drivers | 18 Nov 2019 | Dulles, VA |
Kernel Debugging | 30 Mar 2020 | OSR Seminar Space |
Developing Minifilters | 27 Apr 2020 | OSR Seminar Space & ONLINE |
Comments
You've provided a snippet of some random driver (that is actually a copy/paste of a sample driver) and asked if it works. Who knows? Have you tried it?
I'm sorry, there is no way anyone can help you with whatever you're asking based on what you've provided. Also, please take the effort to fix the formatting.
-scott
OSR
I copied some function since source code:
https://github.com/kenjiuno/NRedir4Dokan/blob/master/sys/NRedir4Dokan.cpp
It is code conforme about STATUS_REPARSE ??
Else the source code that I modified work good.
If you're just asking about the mechanics of STATUS_REPARSE, sure, yes, you replace the name and then complete the IRP with STATUS_REPARSE. Note that you should use IoReplaceFileObjectName instead of touching the fields of the FILE_OBJECT directly.
Now, whether or not your usage of STATUS_REPARSE is correct I have no idea. You need to test your code.
-scott
OSR
IoReplaceFileObjectName is not implemented for Windows XP.
We’ve previously discussed in the forum why this API exists. Search the archives.
-scott
OSR