数据区读取按照可读取的最大长度为限制

允许读过界限 (过限制返回最大可返回数据)
This commit is contained in:
WangQiang 2016-08-19 07:16:45 +00:00
parent 817917d22a
commit 017fce75b8
2 changed files with 16 additions and 6 deletions

View File

@ -66,13 +66,19 @@ int DataStore::Read(uint offset, Buffer& bs)
uint realOffset = offset - VirAddrBase;
// 检查是否越界
if(Strict && realOffset + size > Data.Length()) return -1;
// if(Strict && realOffset + size > Data.Length()) return -1;
// 只要起始位置在区间内都读,数据超长就返回能返回的!
if(Strict && realOffset > Data.Length()) return -1; // 起始地址越界直接返回
// 执行钩子函数
if(!OnHook(realOffset, size, false)) return -1;
// 从数据区读取数据
return bs.Copy(0, Data, realOffset, size);
// return bs.Copy(0, Data, realOffset, size);
// 取真实长度
int maxsize = offset + size > Data.Length() ? Data.Length() : size;
bs.SetLength(maxsize);
return bs.Copy(0, Data, realOffset, maxsize);
}
bool DataStore::OnHook(uint offset, uint size, bool write)
@ -132,11 +138,13 @@ Area::Area()
Size = 0;
Hook = nullptr;
}
// 参数是读命令里面的偏移和大小
bool Area::Contain(uint offset, uint size)
{
// 数据操作口只认可完整的当前区域
return Offset <= offset && Offset + Size >= offset + size;
//return Offset <= offset && Offset + Size >= offset + size;
// 只要搭边就算数
return offset <= Offset + Size && offset + size >= Offset;
}
/****************************** 数据操作接口 ************************************/

View File

@ -44,9 +44,11 @@ bool TokenDataMessage::ReadData(const DataStore& ds)
{
ByteArray bs(Size);
auto ds2 = (DataStore*)&ds;
ds2->Read(Start, bs);
if (ds2->Read(Start, bs) != -1)return ReadData(bs);
return ReadData(bs);
// 出错返回false
bs.SetLength(0);
return false;
}
// 读取数据