阅读:880回复:1
走过路过,不要错过,各位大虾都来看
我想把磁盘的数据保存到数据库,就是写磁盘的时候写道数据库,读磁盘的时候从数据库读取数据。
读小文件没问题,但是把大文件拷贝到这个磁盘以后,就死了。 这个磁盘是虚拟磁盘。 主要的两个函数 :// write 10 BOOLEAN Write10(PMiniportExt pExt,PSCSI_REQUEST_BLOCK pSrb) { if(!pExt->m_hFileHandle[pSrb->TargetId]) { devDebugPrint(DRIVER_NAME\"*******Write10..no media in device\\n\"); SetSrbSenseCode(pSrb,NO_MEDIA_IN_DEVICE); return TRUE; } SwapReadWriteCBD10(pSrb); ULONG ulStart,ulLen; if(!CheckBound(pExt,pSrb,&ulStart,&ulLen)) { devDebugPrint(DRIVER_NAME\"*******Read10..check bound failed\\n\"); return FALSE; } LARGE_INTEGER pos; pos.QuadPart = ulStart; pos.QuadPart <<= pExt->m_ulBlockShift[pSrb->TargetId]; unsigned long ustart= ntohs(pos.QuadPart); NTSTATUS dStatus; unsigned long StartLBA, len, left,BlockSize ; unsigned short Count, i; WRITE_CMD write_cmd; BlockSize = 512; int j; StartLBA = ustart; //StartLBA = ntohl(*((ULONG *)&pSrb->Cdb[2])); devDebugPrint(\"write %d bytes:\\n\", pSrb->DataTransferLength); DbgPrint ( \"TDI write: %d\\n\", StartLBA ); left = pSrb->DataTransferLength; Count=left/512; DbgPrint ( \"TDI write Count: %d\\n\", Count); for ( i=0; i<Count; i++) { // 发送WRITE_CMD if(!left) { break; } write_cmd.cmd_id = 0x2a; write_cmd.start_lba = htonl(StartLBA+i); DbgPrint ( \"TDI Rwrite: %d\\n\", StartLBA+i); DbgPrint ( \"1 begin\\n\"); // 拷贝数据 if ( left >= BlockSize) { RtlCopyMemory(write_cmd.sector, (UCHAR *)(pSrb->DataBuffer)+i*BlockSize, BlockSize); write_cmd.write_len = htonl(BlockSize); left -= BlockSize; for ( j=0; j<BlockSize; j++) devDebugPrint(\"%02x \", ((UCHAR *)(pSrb->DataBuffer)+i*BlockSize)[j]); } else { RtlCopyMemory(write_cmd.sector, (UCHAR *)(pSrb->DataBuffer)+i*BlockSize, left); write_cmd.write_len = htonl(left); for ( j=0; j<left; j++) devDebugPrint(\"%02x \", ((UCHAR *)(pSrb->DataBuffer)+i*BlockSize)[j]); left =0; } DbgPrint ( \"1 end\\n\"); len = sizeof(write_cmd); DbgPrint ( \"TDI write len: %d\\n\", len); dStatus = TdiSendDatagram ( // send datagram pTdiTransportObject, // to transport MY_PORT, // port dTdiAddress, // address &write_cmd, // data len ); // size if ( !NT_SUCCESS ( dStatus ) ) DbgPrint ( \"ERROR: writing sending %X\\n\", dStatus ); else DbgPrint ( \"writing send success\\n\" ); // 接收确认 len = sizeof(pExt->buf); dStatus = TdiReceiveDatagram ( pTdiTransportObject, // to transport MY_PORT, // port &dTdiAddress, // address pExt->buf, // buffer &len ); // buffer size DbgPrint ( \"TDI receive len: %d\\n\", len); if ( NT_SUCCESS ( dStatus ) ) DbgPrint ( \"writing rec: success\\n\"); else DbgPrint ( \"ERROR: writing \\n\" ); } return true } // read 10 BOOLEAN Read10(PMiniportExt pExt,PSCSI_REQUEST_BLOCK pSrb) { if(!pExt->m_hFileHandle[pSrb->TargetId]) { devDebugPrint(DRIVER_NAME\"*******Read10..no media in device\\n\"); SetSrbSenseCode(pSrb,NO_MEDIA_IN_DEVICE); return TRUE; } SwapReadWriteCBD10(pSrb); ULONG ulStart,ulLen; if(!CheckBound(pExt,pSrb,&ulStart,&ulLen)) { devDebugPrint(DRIVER_NAME\"*******Read10..check bound failed\\n\"); return FALSE; } LARGE_INTEGER pos; pos.QuadPart = ulStart; pos.QuadPart <<= pExt->m_ulBlockShift[pSrb->TargetId]; unsigned long ustart= ntohs(pos.QuadPart); NTSTATUS dStatus; unsigned long StartLBA, len, left,leftt,BlockSize; unsigned short Count, i, j; READ_CMD read_cmd; BlockSize=512; StartLBA = ustart; //StartLBA = ntohl(*((ULONG *)&pSrb->Cdb[2])); //StartLBA =pSrb->Cdb[2]; DbgPrint ( \"TDI RECEIVE: %d\\n\", StartLBA ); left = pSrb->DataTransferLength; leftt=left; Count =left/512; devDebugPrint(\"read %d bytes:\\n\", pSrb->DataTransferLength); for ( i=0; i<Count; i++) { if(!left) { break; } read_cmd.cmd_id = 0x28; read_cmd.start_lba = htonl(StartLBA+i); DbgPrint ( \"TDI Rwrite: %d\\n\", StartLBA+i); DbgPrint ( \"1 read begin\\n\"); /*if(left>=BlockSize) { read_cmd.read_count = htonl(1); } else { read_cmd.read_count = htonl(left/512); }*/ read_cmd.read_count = htonl(1); len = sizeof(read_cmd); dStatus = TdiSendDatagram ( // send datagram pTdiTransportObject, // to transport MY_PORT, // port dTdiAddress, // address &read_cmd, // data len ); // size if ( !NT_SUCCESS ( dStatus ) ) DbgPrint ( \"ERROR: read send %X\\n\", dStatus ); else DbgPrint ( \"read send success\\n\" ); // 接收结果 len = sizeof(pExt->buf); dStatus = TdiReceiveDatagram ( pTdiTransportObject, // to transport MY_PORT, // port &dTdiAddress, // address pExt->buf, // buffer &len ); // buffer size if ( NT_SUCCESS ( dStatus ) ) { DbgPrint ( \"read rec sucess\\n\" ); DbgPrint ( \"left: %d\\n\", left ); } else { DbgPrint ( \"ERROR: read rec %X\\n\", dStatus ); } if ( left >= BlockSize) { RtlCopyMemory((UCHAR *)(pSrb->DataBuffer)+i*BlockSize, pExt->buf, BlockSize); left -= BlockSize; for ( j=0; j<left; j++) devDebugPrint(\"%02x \", ((UCHAR *)(pSrb->DataBuffer)+i*BlockSize)[j]); } else { RtlCopyMemory((UCHAR*)(pSrb->DataBuffer)+i*BlockSize, pExt->buf, left); for ( j=0; j<left; j++) devDebugPrint(\"%02x \", ((UCHAR *)(pSrb->DataBuffer)+i*BlockSize)[j]); left=0; } } return true; } |
|
|
沙发#
发布于:2005-04-08 16:17
不会bus reset吗???
|
|