Hi,
Please help me…
I’m creating a windows device object in the handler function of user land IOCTL. Device is getting created and IocreateSymblicname() also returnred successfully. But symbolic link is not shown in winobj.
code:-
Ioctl func(){
switch (code) {
case IOCTL_BUSE_DEVICE_ADD: {
DbgPrint(“IOCTL_BUSE_DEVICE_ADD for device %i.\n”, device_extension->DeviceNumber);
if (inputBufferLength < sizeof(BUSE_ADD_DISK)) {
DbgPrint(“Invalid input buffer size. Got: %u Expected at least: %u.\n”,
inputBufferLength, (int)(sizeof(BUSE_ADD_DISK)));
status = STATUS_INVALID_PARAMETER;
break;
}
else if (outputBufferLength < sizeof(BUSE_ADD_DISK_RESPONSE)) {
DbgPrint(“Invalid output buffer size. Got: %u Expected at least: %u.\n”,
outputBufferLength, (int)(sizeof(BUSE_ADD_DISK_RESPONSE)));
status = STATUS_INVALID_PARAMETER;
break;
}
DbgPrint(“Referencing handle %p.\n”, *(PHANDLE)Irp->AssociatedIrp.SystemBuffer);
PBUSE_ADD_DISK add_disk = (PBUSE_ADD_DISK)buffer;
DbgPrint(“IOCTL_BUSE_DEVICE_ADD info dev no %u, sec size %u, dev_size %u.\n”,
add_disk->ad_dev_number, add_disk->ad_dev_sec_size, add_disk->ad_dev_size_MB);
status = BuseDiskAddDisk(DeviceObj->DriverObject, add_disk, L"G:");
if (!NT_SUCCESS(status)) {
DbgPrint(“Cannot add disk device (%#x).\n”, status);
return status;
}
}
NTSTATUS BuseDiskAddDisk(PDRIVER_OBJECT DriverObject, PBUSE_ADD_DISK add_disk, PCWSTR letter) {
PDEVICE_EXTENSION pDeviceExtension = NULL;
UNICODE_STRING ntDeviceName;
NTSTATUS status;
WCHAR VirtVolInstanceName[128];
PDEVICE_OBJECT DeviceObject;
ULONG device_characteristics;
DEVICE_TYPE device_type;
device_type = FILE_DEVICE_DISK;
device_characteristics = 0;
RtlStringCchPrintfW(VirtVolInstanceName, RTL_NUMBER_OF(VirtVolInstanceName), L"\Device\BuseVol%d", add_disk->ad_dev_number);
RtlInitUnicodeString(&ntDeviceName, VirtVolInstanceName);
DbgPrint(“Creating device ‘%ws’. Device type %#x, characteristics %#x.\n”, (PWSTR)VirtVolInstanceName, device_type, device_characteristics);
status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
&ntDeviceName,
device_type,
device_characteristics,
FALSE,
&DeviceObject);
if (!NT_SUCCESS(status)) {
DbgPrint(“Cannot create DeviceObject (%#x).\n”, status);
return status;
}
DeviceObject->Flags |= DO_DIRECT_IO;
pDeviceExtension = (PDEVICE_EXTENSION)(DeviceObject)->DeviceExtension;
RtlZeroMemory(pDeviceExtension, sizeof(DEVICE_EXTENSION));
// Allocate memory for the volume image.
pDeviceExtension->DevSz = add_disk->ad_dev_size_MB * BUSE_MB_TO_BYTES;
pDeviceExtension->VolumeImage = ExAllocatePoolWithTag(NonPagedPool, pDeviceExtension->DevSz, BUSE_VOL_TAG);
if (pDeviceExtension->VolumeImage) {
RtlZeroMemory(pDeviceExtension->VolumeImage, pDeviceExtension->DevSz);
pDeviceExtension->DiskGeometry.BytesPerSector = add_disk->ad_dev_sec_size;
pDeviceExtension->DiskGeometry.SectorsPerTrack = 32;
pDeviceExtension->DiskGeometry.TracksPerCylinder = 2;
pDeviceExtension->DiskGeometry.Cylinders.QuadPart =
pDeviceExtension->DevSz / pDeviceExtension->DiskGeometry.BytesPerSector / 32 / 2;
// Our media type is FixedMedia
pDeviceExtension->DiskGeometry.MediaType = FixedMedia;
pDeviceExtension->DeviceNumber = add_disk->ad_dev_number;
status = ExUuidCreate(&pDeviceExtension->UniqueIdGuid);
UNICODE_STRING win32Name;
RtlInitUnicodeString(&win32Name, DOS_DEVICE_NAME);
pDeviceExtension->SymbolicLink.Buffer = (PWSTR)&pDeviceExtension->DosDeviceNameBuffer;
pDeviceExtension->SymbolicLink.MaximumLength = sizeof(pDeviceExtension->DosDeviceNameBuffer);
pDeviceExtension->SymbolicLink.Length = win32Name.Length;
UNICODE_STRING driveletter;
RtlInitUnicodeString(&driveletter, letter);
pDeviceExtension->DriveLetter.Buffer = (PWSTR)&pDeviceExtension->DriveLetterBuffer;
pDeviceExtension->DriveLetter.MaximumLength = sizeof(pDeviceExtension->DriveLetterBuffer);
pDeviceExtension->DriveLetter.Length = driveletter.Length;
RtlCopyUnicodeString(&pDeviceExtension->DriveLetter, &driveletter);
RtlCopyUnicodeString(&pDeviceExtension->SymbolicLink, &win32Name);
RtlAppendUnicodeStringToString(&pDeviceExtension->SymbolicLink, &driveletter);
DbgPrint(“Creating device ‘%ws’. Device symb ‘%ws’\n”, (PWSTR)VirtVolInstanceName, (PWSTR)pDeviceExtension->DriveLetterBuffer);
status = IoCreateUnprotectedSymbolicLink(&pDeviceExtension->SymbolicLink, &ntDeviceName);
if (!NT_SUCCESS(status)) {
DbgPrint(“Cannot create pDeviceExtension device symblink (%#x).\n”, status);
IoDeleteDevice(DeviceObject);
return status;
}
UNICODE_STRING ntName;
RtlInitUnicodeString(&ntName, VirtVolInstanceName);
pDeviceExtension->NtDeviceName.Buffer = (PWSTR)&pDeviceExtension->NtDeviceNameBuffer;
pDeviceExtension->NtDeviceName.MaximumLength = sizeof(pDeviceExtension->NtDeviceNameBuffer);
pDeviceExtension->NtDeviceName.Length = ntName.Length;
RtlCopyUnicodeString(&pDeviceExtension->NtDeviceName, &ntName);
}
else {
DbgPrint(“Unable to grab memory\n”);
}
return status;
}