NTSTATUS LsuGetDiskInfoBlockV1( IN PLANSCSI_SESSION LSS, OUT PNDAS_DIB DiskInformationBlock, IN UINT64 LogicalBlockAddress, IN ULONG BlockBytes, IN ULONG PduFlags ) { NTSTATUS status; status = LsuReadBlocks(LSS, (PBYTE)DiskInformationBlock, LogicalBlockAddress, 1, BlockBytes, PduFlags); if(!NT_SUCCESS(status)) { return status; } if( DiskInformationBlock->Signature != NDAS_DIB_SIGNATURE || IS_NDAS_DIBV1_WRONG_VERSION(*DiskInformationBlock) ) { status = STATUS_REVISION_MISMATCH; KDPrintM(DBG_OTHER_ERROR, ("Error: Revision mismatch. Signature:0x%08lx, Revision:%d.%d\n", DiskInformationBlock->Signature, DiskInformationBlock->MajorVersion, DiskInformationBlock->MinorVersion )); } return status; }
NTSTATUS LsuGetDiskInfoBlockV2( PLANSCSI_SESSION LSS, PNDAS_DIB_V2 DiskInformationBlock, UINT64 LogicalBlockAddress, ULONG PduFlags ) { NTSTATUS status; status = LsuReadBlocks(LSS, (PBYTE)DiskInformationBlock, LogicalBlockAddress, 1, PduFlags); if(!NT_SUCCESS(status)) { return status; } // // Revision check // if( DiskInformationBlock->Signature != NDAS_DIB_V2_SIGNATURE || IS_HIGHER_VERSION_V2(*DiskInformationBlock) ) { status = STATUS_REVISION_MISMATCH; KDPrintM(DBG_PROTO_ERROR, ("Error: Revision mismatch. Signature:0x%08lx, Revision:%u.%u\n", DiskInformationBlock->Signature, DiskInformationBlock->MajorVersion, DiskInformationBlock->MinorVersion )); } return status; }
NTSTATUS LsuGetDiskInfoBlockV2( IN PLANSCSI_SESSION LSS, OUT PNDAS_DIB_V2 DiskInformationBlock, IN UINT64 LogicalBlockAddress, IN ULONG BlockBytes, IN ULONG PduFlags ) { NTSTATUS status; status = LsuReadBlocks(LSS, (PBYTE)DiskInformationBlock, LogicalBlockAddress, 1, BlockBytes, PduFlags); if(!NT_SUCCESS(status)) { return status; } // // Revision check // if( DiskInformationBlock->Signature != NDAS_DIB_V2_SIGNATURE || IS_HIGHER_VERSION_V2(*DiskInformationBlock) ) { status = STATUS_REVISION_MISMATCH; KDPrintM(DBG_OTHER_ERROR, ("Error: Revision mismatch. Signature:0x%08lx, Revision:%u.%u\n", DiskInformationBlock->Signature, DiskInformationBlock->MajorVersion, DiskInformationBlock->MinorVersion )); } // // CRC check. // if(NT_SUCCESS(status)) { if(IS_DIB_CRC_VALID(crc32_calc, *DiskInformationBlock) != TRUE) { KDPrintM(DBG_OTHER_ERROR, ("DIBv2's crc is invalid.\n")); status = STATUS_REVISION_MISMATCH; } } return status; }
NTSTATUS LsuGetBlockACL( IN PLANSCSI_SESSION LSS, OUT PBLOCK_ACCESS_CONTROL_LIST BlockACL, IN ULONG BlockACLLen, IN UINT64 LogicalBlockAddress, IN ULONG BlockBytes, IN ULONG PduFlags ) { NTSTATUS status; ULONG readBlock; PBYTE buffer; ASSERT(BlockBytes); ASSERT(BlockACLLen); // // allocate block buffer // readBlock = (BlockACLLen + BlockBytes) / BlockBytes; buffer = (PBYTE)ExAllocatePoolWithTag(NonPagedPool, readBlock * BlockBytes, LSU_POOLTAG_BLOCKBUFFER); if(buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; status = LsuReadBlocks(LSS, buffer, LogicalBlockAddress, readBlock, BlockBytes, PduFlags); if(!NT_SUCCESS(status)) { ExFreePoolWithTag(buffer, LSU_POOLTAG_BLOCKBUFFER); return status; } // // Copy to the caller's buffer // RtlCopyMemory(BlockACL, buffer, BlockACLLen); // // Free the buffer // ExFreePoolWithTag(buffer, LSU_POOLTAG_BLOCKBUFFER); // // Revision check // if( BlockACL->Signature != BACL_SIGNATURE || BlockACL->Version != BACL_VERSION) { status = STATUS_REVISION_MISMATCH; KDPrintM(DBG_OTHER_ERROR, ("Error: Revision mismatch. Signature:0x%08lx, Version:%u\n", BlockACL->Signature, BlockACL->Version)); } // // CRC check. // if(NT_SUCCESS(status)) { UINT32 crc; crc = crc32_calc((PUCHAR)BlockACL->Elements, BlockACL->ElementCount * sizeof(BLOCK_ACCESS_CONTROL_LIST_ELEMENT)); if(crc != BlockACL->crc) { KDPrintM(DBG_OTHER_ERROR, ("BACL's crc is invalid.\n")); return STATUS_REVISION_MISMATCH; } } return status; }