Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

343 lines
7.8 KiB

/*++
Copyright (c) 1991-1998 Microsoft Corporation
Module Name:
sdcard.c
Abstract:
Author:
Neil Sandlin (neilsa) 1-Jan-01
Environment:
Kernel mode only.
--*/
#include "pch.h"
#include "ntddsd.h"
NTSTATUS
SdCardRead(
IN PSFFDISK_EXTENSION sffdiskExtension,
IN PIRP Irp
);
NTSTATUS
SdCardWrite(
IN PSFFDISK_EXTENSION sffdiskExtension,
IN PIRP Irp
);
NTSTATUS
SdCardInitialize(
IN PSFFDISK_EXTENSION sffdiskExtension
);
NTSTATUS
SdCardDeleteDevice(
IN PSFFDISK_EXTENSION sffdiskExtension
);
NTSTATUS
SdCardGetDiskParameters(
IN PSFFDISK_EXTENSION sffdiskExtension
);
BOOLEAN
SdCardIsWriteProtected(
IN PSFFDISK_EXTENSION sffdiskExtension
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,SdCardRead)
#pragma alloc_text(PAGE,SdCardWrite)
#pragma alloc_text(PAGE,SdCardInitialize)
#pragma alloc_text(PAGE,SdCardDeleteDevice)
#pragma alloc_text(PAGE,SdCardGetDiskParameters)
#pragma alloc_text(PAGE,SdCardIsWriteProtected)
#endif
#pragma pack(1)
typedef struct _SD_MASTER_BOOT_RECORD {
UCHAR Ignore1[446];
UCHAR BootIndicator;
UCHAR StartingHead;
USHORT StartingSectorCyl;
UCHAR SystemId;
UCHAR EndingHead;
USHORT EndingSectorCyl;
ULONG RelativeSector;
ULONG TotalSector;
UCHAR Ignore2[16*3];
USHORT SignatureWord;
} SD_MASTER_BOOT_RECORD, *PSD_MASTER_BOOT_RECORD;
#pragma pack()
SFFDISK_FUNCTION_BLOCK SdCardSupportFns = {
SdCardInitialize,
SdCardDeleteDevice,
SdCardGetDiskParameters,
SdCardIsWriteProtected,
SdCardRead,
SdCardWrite
};
NTSTATUS
SdCardInitialize(
IN PSFFDISK_EXTENSION sffdiskExtension
)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
NTSTATUS status;
SDBUS_INTERFACE_DATA interfaceData;
RtlZeroMemory(&interfaceData, sizeof(SDBUS_INTERFACE_DATA));
interfaceData.Size = sizeof(SDBUS_INTERFACE_DATA);
interfaceData.Version = SDBUS_INTERFACE_VERSION;
interfaceData.TargetObject = sffdiskExtension->TargetObject;
status = SdBusOpenInterface(&interfaceData, &sffdiskExtension->SdbusInterfaceContext);
if (!NT_SUCCESS(status)) {
return status;
}
try{
SD_MASTER_BOOT_RECORD partitionTable;
ULONG lengthRead;
status = SdBusReadMemory(sffdiskExtension->SdbusInterfaceContext,
0,
&partitionTable,
512,
&lengthRead);
if (!NT_SUCCESS(status)) {
leave;
}
if (partitionTable.SignatureWord != 0xAA55) {
SffDiskDump( SFFDISKSHOW, ("Invalid partition table signature - %.4x\n",
partitionTable.SignatureWord));
status = STATUS_UNSUCCESSFUL;
leave;
}
SffDiskDump( SFFDISKSHOW, ("SFFDISK: SD device relative=%.8x total=%.8x\n",
partitionTable.RelativeSector, partitionTable.TotalSector));
sffdiskExtension->RelativeOffset = partitionTable.RelativeSector * 512;
sffdiskExtension->SystemId = partitionTable.SystemId;
} finally {
if (!NT_SUCCESS(status)) {
SdBusCloseInterface(sffdiskExtension->SdbusInterfaceContext);
}
}
return status;
}
NTSTATUS
SdCardDeleteDevice(
IN PSFFDISK_EXTENSION sffdiskExtension
)
{
NTSTATUS status;
status = SdBusCloseInterface(sffdiskExtension->SdbusInterfaceContext);
return status;
}
BOOLEAN
SdCardIsWriteProtected(
IN PSFFDISK_EXTENSION sffdiskExtension
)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
NTSTATUS status;
SDBUS_DEVICE_PARAMETERS deviceParameters;
BOOLEAN writeProtected = TRUE;
status = SdBusGetDeviceParameters(sffdiskExtension->SdbusInterfaceContext,
&deviceParameters,
sizeof(deviceParameters));
if (NT_SUCCESS(status)) {
writeProtected = deviceParameters.WriteProtected;
}
return writeProtected;
}
NTSTATUS
SdCardGetDiskParameters(
IN PSFFDISK_EXTENSION sffdiskExtension
)
/*++
Routine Description:
Arguments:
device extension for the card
Return Value:
--*/
{
NTSTATUS status;
SDBUS_DEVICE_PARAMETERS deviceParameters;
status = SdBusGetDeviceParameters(sffdiskExtension->SdbusInterfaceContext,
&deviceParameters,
sizeof(deviceParameters));
if (NT_SUCCESS(status)) {
sffdiskExtension->ByteCapacity = (ULONG) deviceParameters.Capacity;
sffdiskExtension->Cylinders = sffdiskExtension->ByteCapacity / (8 * 2 * 512);
sffdiskExtension->TracksPerCylinder = 2;
sffdiskExtension->SectorsPerTrack = 8;
sffdiskExtension->BytesPerSector = 512;
}
return status;
}
NTSTATUS
SdCardRead(
IN PSFFDISK_EXTENSION sffdiskExtension,
IN PIRP Irp
)
/*++
Routine Description:
This routine is called to read/write data to/from the memory card.
Arguments:
DeviceObject - a pointer to the object that represents the device
that I/O is to be done on.
Irp - a pointer to the I/O Request Packet for this request.
Return Value:
STATUS_SUCCESS if the packet was successfully read or written; the
appropriate error is propogated otherwise.
--*/
{
NTSTATUS status;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
ULONG lengthRead;
status = SdBusReadMemory(sffdiskExtension->SdbusInterfaceContext,
irpSp->Parameters.Read.ByteOffset.QuadPart + sffdiskExtension->RelativeOffset,
MmGetSystemAddressForMdl(Irp->MdlAddress),
irpSp->Parameters.Read.Length,
&lengthRead);
Irp->IoStatus.Status = status;
if (NT_SUCCESS(status)) {
Irp->IoStatus.Information = lengthRead;
}
return status;
}
NTSTATUS
SdCardWrite(
IN PSFFDISK_EXTENSION sffdiskExtension,
IN PIRP Irp
)
/*++
Routine Description:
This routine is called to read/write data to/from the memory card.
Arguments:
DeviceObject - a pointer to the object that represents the device
that I/O is to be done on.
Irp - a pointer to the I/O Request Packet for this request.
Return Value:
STATUS_SUCCESS if the packet was successfully read or written; the
appropriate error is propogated otherwise.
--*/
{
NTSTATUS status;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
ULONG lengthWritten;
status = SdBusWriteMemory(sffdiskExtension->SdbusInterfaceContext,
irpSp->Parameters.Write.ByteOffset.QuadPart + sffdiskExtension->RelativeOffset,
MmGetSystemAddressForMdl(Irp->MdlAddress),
irpSp->Parameters.Write.Length,
&lengthWritten);
Irp->IoStatus.Status = status;
if (NT_SUCCESS(status)) {
Irp->IoStatus.Information = lengthWritten;
}
return status;
}