wdynasty
驱动大牛
驱动大牛
  • 注册日期2003-10-10
  • 最后登录2011-04-07
  • 粉丝0
  • 关注0
  • 积分627分
  • 威望199点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:880回复:1

走过路过,不要错过,各位大虾都来看

楼主#
更多 发布于:2005-04-06 16:32
我想把磁盘的数据保存到数据库,就是写磁盘的时候写道数据库,读磁盘的时候从数据库读取数据。
读小文件没问题,但是把大文件拷贝到这个磁盘以后,就死了。
这个磁盘是虚拟磁盘。
主要的两个函数
:// 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;
}
21世纪是搜索的世界,看看BAIDU的股票就知道了。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-08 16:17
不会bus reset吗???
游客

返回顶部