//= //= //= //= PROTO //= STRUCT //= VAR //r //& PROC //r NTSTATUS RamDskDispatchSystemControlProc (IN PDEVICE_OBJECT FDO , IN PIRP IRP ) { //- INIT NTSTATUS STATUS = STATUS_SUCCESS ; PIO_STACK_LOCATION _pIrpStack = IoGetCurrentIrpStackLocation(IRP); PDEVICE_EXTENSION _pDevExt = (PDEVICE_EXTENSION )FDO->DeviceExtension; ULONG _ControlCode = _pIrpStack ->Parameters.DeviceIoControl.IoControlCode ; ULONG _information =0; //- BODY SWITCH (_ControlCode) { //........................................................................................................... case IOCTL_DISK_GET_PARTITION_INFO: { IF (_pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(PARTITION_INFORMATION)) { STATUS = STATUS_BUFFER_TOO_SMALL; // Нужен буфер больше DbgPrint("Output buffer too small... \n" ); _information = sizeof(PARTITION_INFORMATION); } ELSE { PPARTITION_INFORMATION outputBuffer; outputBuffer = ( PPARTITION_INFORMATION )IRP->AssociatedIrp.SystemBuffer; outputBuffer->PartitionType = (UCHAR)_pDevExt ->DiskRegInfo.PartitionType; outputBuffer->BootIndicator = FALSE; outputBuffer->RecognizedPartition = FALSE; outputBuffer->RewritePartition = FALSE; outputBuffer->StartingOffset = invoke RtlConvertUlongToLargeInteger(0); outputBuffer->PartitionLength =invoke RtlConvertUlongToLargeInteger(_pDevExt ->DiskRegInfo.DiskSize); outputBuffer->HiddenSectors = (ULONG) (1L); outputBuffer->PartitionNumber = (ULONG) (1L); STATUS = STATUS_SUCCESS; _information = sizeof( PARTITION_INFORMATION ); } DbgPrint("=IOCTL_GET_PARTITION= " ); break; } //.................................................................................................................. case IOCTL_DISK_GET_DRIVE_GEOMETRY: case IOCTL_DISK_GET_MEDIA_TYPES: { _pDevExt ->DiskGeometry.TracksPerCylinder=16; _pDevExt ->DiskGeometry.SectorsPerTrack =32; _pDevExt ->DiskGeometry.BytesPerSector =512; _pDevExt ->DiskGeometry.MediaType =FixedMedia; _pDevExt ->DiskGeometry.Cylinders.HighPart =0; _pDevExt ->DiskGeometry.Cylinders.LowPart = _pDevExt ->DiskRegInfo.DiskSize / (_pDevExt ->DiskGeometry.BytesPerSector * _pDevExt ->DiskGeometry.SectorsPerTrack* _pDevExt ->DiskGeometry.TracksPerCylinder ); DbgPrint("=IOCTL_GET_GEOMETRY= " ); break; } //.................................................................................................................. case IOCTL_DISK_CHECK_VERIFY: case IOCTL_DISK_MEDIA_REMOVAL: case IOCTL_DISK_FORMAT_TRACKS: case IOCTL_DISK_IS_WRITABLE: { STATUS = STATUS_SUCCESS; DbgPrint("=IOCTL_IS_= " ); break; } //.................................................................................................................. case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME: case IOCTL_DISK_SET_PARTITION_INFO: { DbgPrint("=IOCTL_SET_= " ); break; } //.................................................................................................................. case IOCTL_MOUNTMGR_QUERY_POINTS: { STATUS = STATUS_INVALID_DEVICE_REQUEST; DbgPrint("=IOCTL_QUERY_POINTS= " ); break; } //.................................................................................................................. } DbgPrint("=DISPATCH SYSTEM= " ); RETURN CompleteIrp( IRP , STATUS , _information ); } ;//