Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

165 lines
6.2 KiB

#include "uksPCH.h"
extern "C" {
#include <wdm.h>
}
#include <ks.h>
#include "inc/KrmCommStructs.h"
#include "SBuffer.h"
//------------------------------------------------------------------------------
SBuffer::SBuffer(BYTE* BufX, unsigned int Len){
buf=BufX;
getPos=0;
putPos=0;
len=Len;
lasterror=KRM_OK;
};
//------------------------------------------------------------------------------
SBuffer::~SBuffer(){
buf=NULL;
};
//------------------------------------------------------------------------------
void SBuffer::reset(){
getPos=0;
putPos=0;
lasterror=KRM_OK;
};
//------------------------------------------------------------------------------
DRM_STATUS SBuffer::append(BYTE* Data, DWORD datLen){
unsigned int p;
if (KRM_OK == getPutPosAndAdvance(&p,datLen)) {
memcpy(buf+p, Data, datLen);
}
return lasterror;
};
//------------------------------------------------------------------------------
void SBuffer::err(const char* Msg, DRM_STATUS err){
lasterror = err;
#ifdef DBG
DbgPrint("DRMK:");DbgPrint((char*) Msg);DbgPrint("\n");
#endif
ASSERT(FALSE);
};
//------------------------------------------------------------------------------
DRM_STATUS SBuffer::getGetPosAndAdvance(unsigned int *pos, unsigned int Len) {
if (KRM_OK == lasterror) {
if (Len > len-getPos) {
err("pop overflow", KRM_BUFSIZE);
}
else {
*pos=getPos;
getPos+=Len;
}
}
return lasterror;
};
//------------------------------------------------------------------------------
DRM_STATUS SBuffer::getPutPosAndAdvance(unsigned int *pos, unsigned int Len) {
if (KRM_OK == lasterror) {
if (Len > len-putPos) {
err("push overflow", KRM_BUFSIZE);
}
else {
*pos=putPos;
putPos+=Len;
}
}
return lasterror;
};
//------------------------------------------------------------------------------
#define INSERT(_TYPE, _OBJADDR) \
if (KRM_OK == lasterror) { \
unsigned int _size=sizeof(_TYPE); \
if (_size > len-putPos) { \
err("push overflow",KRM_BUFSIZE); \
} \
else { \
memcpy(buf+putPos, _OBJADDR, _size); \
putPos+=_size; \
} \
} \
return *this;
//------------------------------------------------------------------------------
#define EXTRACT(_TYPE, _OBJADDR) \
if (KRM_OK == lasterror) { \
unsigned int _size = sizeof(_TYPE); \
if(_size > len-getPos) { \
err("pop overflow",KRM_BUFSIZE); \
} \
else { \
memcpy(_OBJADDR, buf+getPos, _size); \
getPos += _size; \
} \
} \
return *this;
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (const DWORD Val) {
INSERT(DWORD, &Val);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (const PVOID Ptr) {
INSERT(DWORD, &Ptr);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (PDRMRIGHTS R) {
INSERT(DRMRIGHTS, R);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (PSTREAMKEY S) {
INSERT(STREAMKEY, S);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (PCERT C) {
INSERT(CERT, C);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator << (PDRMDIGEST D) {
INSERT(DRMDIGEST, D);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator >> (DWORD& Val) {
EXTRACT(DWORD, &Val);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator >> (DRMRIGHTS* R) {
EXTRACT(DRMRIGHTS, R);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator >> (PSTREAMKEY S) {
EXTRACT(STREAMKEY, S);
};
//------------------------------------------------------------------------------
SBuffer& SBuffer::operator >> (PCERT C) {
EXTRACT(CERT, C);
};
//------------------------------------------------------------------------------
DRM_STATUS term(SBuffer& S) {
if (KRM_OK == S.getLastError()) {
S << 0xFFFFffff;
}
return S.getLastError();
};
//------------------------------------------------------------------------------
DRM_STATUS checkTerm(SBuffer& S) {
if (KRM_OK == S.getLastError()) {
DWORD Val = 0;
S >> Val;
if (KRM_OK == S.getLastError()) {
if (Val != 0xFFFFffff) {
S.err("Bad terminator", KRM_BADTERMINATOR);
}
}
ASSERT(Val==0xFFFFffff);
}
return S.getLastError();;
};
//------------------------------------------------------------------------------