#include "ioex.h"
DWORD XRead(LPVOID file, IOSTRUCT *ios, DWORD offset, LPVOID b, DWORD sz){
DWORD oldpos=ios->SeekFile(file,0,FILE_CURRENT);
DWORD ret;
ios->SeekFile(file,offset,FILE_BEGIN);
ret=ios->ReadFile(file,b,sz);
ios->SeekFile(file,oldpos,FILE_BEGIN);
return ret;
}
DWORD XWrite(LPVOID file, IOSTRUCT *ios, DWORD offset, LPVOID b, DWORD sz){
DWORD oldpos=ios->SeekFile(file,0,FILE_CURRENT);
DWORD ret;
ios->SeekFile(file,offset,FILE_BEGIN);
ret=ios->WriteFile(file,b,sz);
ios->SeekFile(file,oldpos,FILE_BEGIN);
return ret;
}
DWORD ReadEndian(
LPVOID file,
IOSTRUCT *ios,
DWORD offset,
DWORD sz,
BOOL big,
BOOL xread,
DWORD *psz
){
DWORD sizeRead=0;
BYTE buffer[4];
DWORD ret=0;
LONG i;
if(sz<=4 && sz>0){
ZeroMemory(buffer,4);
if(xread){
sizeRead=XRead(file,ios,offset,buffer,sz);
} else {
sizeRead=ios->ReadFile(file,buffer,sz);
}
if(big){
for(i=0;i<sz;i++){
ret<<=8;
ret|=buffer[i];
}
} else {
for(i=sz-1;i>=0;i--){
ret<<=8;
ret|=buffer[i];
}
}
}
if(psz)*psz=sizeRead;
return ret;
}
DWORD WriteEndian(
LPVOID file,
IOSTRUCT *ios,
DWORD offset,
DWORD x,
DWORD sz,
BOOL big,
BOOL xwrite
){
DWORD sizeWrite=0;
BYTE buffer[4];
LONG i;
if(sz<=4 && sz>0){
ZeroMemory(buffer,4);
if(big){
for(i=sz-1;i>=0;i--){
buffer[i]=x&0xFF;
x>>=8;
}
} else {
for(i=0;i<sz;i++){
buffer[i]=x&0xFF;
x>>=8;
}
}
if(xwrite){
sizeWrite=XWrite(file,ios,offset,buffer,sz);
} else {
sizeWrite=ios->WriteFile(file,buffer,sz);
}
}
return sizeWrite;
}
LONG ReadEndianSigned(
LPVOID file,
IOSTRUCT *ios,
DWORD offset,
DWORD sz,
BOOL big,
BOOL xread,
DWORD *psz
){
DWORD ret=ReadEndian(file,ios,offset,sz,big,xread,psz);
if(sz<=4 && sz>0){
DWORD extend[]={0,0xFFFFFF00,0xFFFF0000,0xFF000000,0};
DWORD sign[]={0,0x80,0x8000,0x800000,0x80000000};
if(ret&sign[sz])ret|=extend[sz];
}
return (LONG)ret;
}