//=              
//=              
//=              

//=                                                                                                                                          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 );
}       
;//