41 #define TOC_DATA_TRACK 0x04 42 #define TOC_LAST_TRACK 0xaa 45 #define DEFAULT_STRING_SIZE 50 60 DeviceExtension->VolumeObject =
NULL;
61 DeviceExtension->ChangeCount = 0;
62 DeviceExtension->GlobalName.Buffer =
NULL;
63 DeviceExtension->GlobalName.MaximumLength = 0;
64 DeviceExtension->GlobalName.Length = 0;
65 DeviceExtension->ImageName.Buffer =
NULL;
66 DeviceExtension->ImageName.MaximumLength = 0;
67 DeviceExtension->ImageName.Length = 0;
143 if (DeviceExtension->VolumeObject !=
NULL)
146 DeviceExtension->VolumeObject =
NULL;
190 WCHAR DriveLetter[3], CurLetter;
234 FALSE, &LocalDeviceObject);
248 for (CurLetter =
Letter; CurLetter >=
'A'; CurLetter--)
253 DeviceExtension->Flags = 0;
256 DeviceExtension->GlobalName.Length = 0;
263 DriveLetter[0] = CurLetter;
264 DriveLetter[1] =
L':';
284 *EffectiveLetter = CurLetter;
303 if (CurLetter == (
L'A' - 1))
348 Status = ZwQueryInformationFile(ImgHandle, &
IoStatus, &FileStdInfo,
352 DPRINT1(
"Failed to query image information\n");
365 DeviceExtension->SectorSize = 2048;
369 DeviceExtension->SectorSize =
Buffer[1];
373 if (DeviceExtension->SectorSize == 512)
375 DeviceExtension->SectorShift = 9;
379 for (
i = 512, SectorShift = 9;
i < DeviceExtension->SectorSize;
i =
i * 2, ++SectorShift);
380 if (
i == DeviceExtension->SectorSize)
382 DeviceExtension->SectorShift = SectorShift;
386 DeviceExtension->SectorShift = 11;
392 (
PVOID *)&DeviceExtension->VolumeObject,
NULL);
396 DeviceExtension->VolumeObject =
NULL;
402 ++DeviceExtension->ChangeCount;
420 WCHAR EffectiveLetter;
437 WCHAR PathBuffer[100], ResBuffer[100];
454 Path.Buffer = PathBuffer;
456 Path.MaximumLength =
sizeof(PathBuffer);
462 ResString.MaximumLength =
sizeof(ResBuffer);
488 Irp->IoStatus.Information = 0;
507 if (LowerIrp ==
NULL)
516 LowerIrp->MdlAddress =
Mdl;
520 LowerIrp->UserEvent =
Event;
523 LowerIrp->Tail.Overlay.OriginalFileObject =
File;
531 Stack->Parameters.Read.ByteOffset.QuadPart =
Offset->QuadPart;
552 if (DeviceExtension->VolumeObject ==
NULL)
570 if (
Stack->Parameters.Read.Length >
Irp->MdlAddress->ByteCount)
600 if (
Stack->Parameters.Read.ByteOffset.QuadPart / DeviceExtension->SectorSize < 0x20)
664 if (
Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(
WCHAR))
683 if (DeviceExtension->VolumeObject ==
NULL)
703 DiskGeo =
Irp->AssociatedIrp.SystemBuffer;
706 DiskGeo->
SectorsPerTrack = DeviceExtension->VolumeSize.QuadPart >> DeviceExtension->SectorShift;
723 if (DeviceExtension->VolumeObject ==
NULL)
737 Buffer =
Irp->AssociatedIrp.SystemBuffer;
740 *
Buffer = DeviceExtension->ChangeCount;
760 if (DeviceExtension->VolumeObject !=
NULL)
778 Local[2] =
Address % 4500 / 75;
779 Local[3] =
Address + 108 * Local[1] - 75 * Local[2];
781 return *(
ULONG *)(&Local[0]);
791 TrackData->
Adr = Adr;
805 if (DeviceExtension->VolumeObject ==
NULL)
819 if (
Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(
CDROM_TOC))
825 Toc =
Irp->AssociatedIrp.SystemBuffer;
848 if (DeviceExtension->VolumeObject ==
NULL)
874 TocEx =
Irp->AssociatedIrp.SystemBuffer;
900 Toc =
Irp->AssociatedIrp.SystemBuffer;
923 if (DeviceExtension->VolumeObject ==
NULL)
943 Toc =
Irp->AssociatedIrp.SystemBuffer;
964 if (
Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(
DRIVES_LIST))
974 for (CurrentDO =
DeviceObject->DriverObject->DeviceObject; CurrentDO !=
NULL;
975 CurrentDO = CurrentDO->NextDevice)
979 if (DeviceExtension->GlobalName.Length !=
981 L"\\??\\VirtualCdRom",
982 DeviceExtension->GlobalName.Length))
1003 if (
Stack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(
IMAGE_PATH))
1010 ImagePath =
Irp->AssociatedIrp.SystemBuffer;
1011 ImagePath->
Mounted = (DeviceExtension->VolumeObject !=
NULL);
1012 ImagePath->
Length = DeviceExtension->ImageName.Length;
1014 if (DeviceExtension->ImageName.Length != 0)
1016 RtlCopyMemory(ImagePath->
Path, DeviceExtension->ImageName.Buffer, DeviceExtension->ImageName.Length);
1036 if (DeviceExtension->VolumeObject !=
NULL)
1040 ++DeviceExtension->ChangeCount;
1041 DeviceExtension->VolumeObject =
NULL;
1094 switch (
Stack->Parameters.DeviceIoControl.IoControlCode)
1106 MountParameters =
Irp->AssociatedIrp.SystemBuffer;
1110 DeviceExtension->Flags = MountParameters->
Flags;
1159 if (DeviceExtension->ImageName.Buffer ==
NULL || DeviceExtension->VolumeObject !=
NULL)
1171 DPRINT1(
"IOCTL: %x not supported\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
#define DO_DEVICE_INITIALIZING
#define MOUNT_FLAG_SUPP_UDF
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define CDROM_READ_TOC_EX_FORMAT_FULL_TOC
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
#define STATUS_NO_MEDIA_IN_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTATUS ViCheckVerify(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_INFO_LENGTH_MISMATCH
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define OBJ_CASE_INSENSITIVE
#define PsGetCurrentThread()
IN BOOLEAN OUT PSTR Buffer
NTSTATUS ViEnumerateDrives(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS NTAPI VcdHandle(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_INVALID_PARAMETER
#define BooleanFlagOn(F, SF)
#define IOCTL_CDROM_CHECK_VERIFY
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
UCHAR FirstCompleteSession
NTSTATUS ViRemountMedia(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_OBJECT_NAME_EXISTS
UNICODE_STRING GlobalName
#define IOCTL_DISK_CHECK_VERIFY
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
#define IOCTL_CDROM_GET_LAST_SESSION
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
#define STATUS_INVALID_DEVICE_REQUEST
NTSTATUS ViSetIoStatus(NTSTATUS Status, ULONG_PTR Information, PIRP Irp)
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
#define STATUS_WRONG_VOLUME
#define IOCTL_VCDROM_MOUNT_IMAGE
#define STATUS_VERIFY_REQUIRED
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
#define MDL_MAPPED_TO_SYSTEM_VA
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_UNRECOGNIZED_MEDIA
#define FILE_DEVICE_CD_ROM
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
#define ADR_NO_MODE_INFORMATION
_In_ PDEVICE_OBJECT DeviceObject
NTSTATUS ViGetImagePath(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS NTAPI VcdDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS ViEjectMedia(PDEVICE_OBJECT DeviceObject, PIRP Irp)
_In_ PVOID _In_ ULONG Event
#define EXCEPTION_EXECUTE_HANDLER
#define IOCTL_STORAGE_EJECT_MEDIA
_In_ WDF_WMI_PROVIDER_CONTROL Control
UCHAR LastCompleteSession
#define RTL_QUERY_REGISTRY_SUBKEY
#define CDROM_READ_TOC_EX_FORMAT_CDTEXT
#define IoCompleteRequest
#define SL_OVERRIDE_VERIFY_VOLUME
#define STATUS_MEDIA_WRITE_PROTECTED
#define CDROM_READ_TOC_EX_FORMAT_PMA
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
#define IOCTL_VCDROM_CREATE_DRIVE
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
VOID ViCreateDriveAndMountImage(PDRIVER_OBJECT DriverObject, WCHAR Letter, LPCWSTR ImagePath)
NTSTATUS ViIssueMountImage(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING Image, PIRP Irp)
#define NT_SUCCESS(StatCode)
#define IOCTL_CDROM_GET_DRIVE_GEOMETRY
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
#define IOCTL_VCDROM_ENUMERATE_DRIVES
#define ObDereferenceObject
PFILE_OBJECT VolumeObject
NTSTATUS ViMountImage(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING Image)
#define ExAllocatePoolWithTag(hernya, size, tag)
vector< wstring > DrivesList
#define FILE_ATTRIBUTE_NORMAL
NTSTATUS ViDeleteDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS ViAllocateUnicodeString(USHORT BufferLength, PUNICODE_STRING UnicodeString)
#define MAXIMUM_CDROM_SIZE
VOID ViLoadImagesFromRegistry(PDRIVER_OBJECT DriverObject, LPCWSTR RegistryPath)
NTSTATUS NTAPI VcdRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID ViInitializeDeviceExtension(PDEVICE_OBJECT DeviceObject)
#define IOCTL_VCDROM_GET_IMAGE_PATH
#define RTL_REGISTRY_ABSOLUTE
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
NTSTATUS ViReadTocEx(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define CDROM_READ_TOC_EX_FORMAT_TOC
_In_ ULONG _In_ ULONG Offset
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
VOID NTAPI VcdUnload(PDRIVER_OBJECT DriverObject)
NTSTATUS ViReadToc(PDEVICE_OBJECT DeviceObject, PIRP Irp)
PRTL_UNICODE_STRING_BUFFER Path
#define KeInitializeEvent(pEvt, foo, foo2)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define CDROM_READ_TOC_EX_FORMAT_ATIP
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
#define IOCTL_CDROM_READ_TOC_EX
PDEVICE_OBJECT DeviceObject
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define IOCTL_STORAGE_LOAD_MEDIA
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define CDROM_READ_TOC_EX_FORMAT_SESSION
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define MOUNT_FLAG_SUPP_JOLIET
struct _DEVICE_EXTENSION DEVICE_EXTENSION
#define STATUS_IO_TIMEOUT
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
ULONG ViComputeAddress(ULONG Address)
#define FileStandardInformation
NTSTATUS ViCreateDriveLetter(PDRIVER_OBJECT DriverObject, WCHAR Letter, WCHAR *EffectiveLetter, PDEVICE_OBJECT *DeviceObject)
#define FILE_SYNCHRONOUS_IO_NONALERT
NTSTATUS ViReadFile(PFILE_OBJECT File, PMDL Mdl, PLARGE_INTEGER Offset, PKEVENT Event, ULONG Length, PIO_STATUS_BLOCK IoStatusBlock)
NTSTATUS ViCreateDevice(PDRIVER_OBJECT DriverObject, PIRP Irp)
VOID ViFreeUnicodeString(PUNICODE_STRING UnicodeString)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS]
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
#define DEFAULT_STRING_SIZE
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
NTSTATUS ViGetLastSession(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID ViFillInTrackData(PTRACK_DATA TrackData, UCHAR Control, UCHAR Adr, UCHAR TrackNumber, ULONG Address)
#define IOCTL_CDROM_READ_TOC
#define _SEH2_EXCEPT(...)
#define ExFreePoolWithTag(_P, _T)
#define _SEH2_GetExceptionCode()
convenient loading of string resources
#define FILE_FLOPPY_DISKETTE
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID _In_ LONG _In_z_ PCHAR File
struct _DEVICE_EXTENSION * PDEVICE_EXTENSION
#define IOCTL_CDROM_EJECT_MEDIA
#define IOCTL_VCDROM_DELETE_DRIVE
#define MDL_ALLOCATED_FIXED_SIZE
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
NTSTATUS ViVerifyVolume(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSYSAPI NTSTATUS NTAPI ZwOpenSymbolicLinkObject(_Out_ PHANDLE SymbolicLinkHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define RTL_QUERY_REGISTRY_DIRECT
#define FILE_READ_ONLY_DEVICE
NTSTATUS ViGetDriveGeometry(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define RtlCompareMemory(s1, s2, l)
#define IRP_SYNCHRONOUS_PAGING_IO
#define IRP_MJ_DEVICE_CONTROL
#define STATUS_DEVICE_NOT_READY