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
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;
|
|
}
|
|
|