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
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();;
|
|
};
|
|
//------------------------------------------------------------------------------
|