Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}