Some checks failed
Build / virtualsmartcard-macos (push) Has been cancelled
Build / virtualsmartcard-ubuntu (push) Has been cancelled
Build / ccid-ubuntu (push) Has been cancelled
Build / pcsc-relay-macos (push) Has been cancelled
Build / pcsc-relay-ubuntu (push) Has been cancelled
Build / pcsc-relay-mingw-64 (push) Has been cancelled
Build / remote-reader-ubuntu (push) Has been cancelled
Build / ACardEmulator-ubuntu (push) Has been cancelled
Coverity Scan / build (push) Has been cancelled
May fix unstability issues #326 #324 (cherry picked from commit 7c949d1ec0e40ca2aabf92192cdf9f66a4a7a0bf)
96 lines
2.6 KiB
C++
96 lines
2.6 KiB
C++
#include "memory.h"
|
|
#include "SectionLocker.h"
|
|
|
|
bool getBuffer(IWDFIoRequest* pRequest,void **buffer,SIZE_T *bufferLen) {
|
|
IWDFMemory *inmem=NULL;
|
|
pRequest->GetInputMemory(&inmem);
|
|
if (inmem==NULL) {
|
|
OutputDebugString(L"GetInputMemory failed");
|
|
return false;
|
|
}
|
|
else {
|
|
SIZE_T size;
|
|
void *data=inmem->GetDataBuffer(&size);
|
|
if (0 != size) {
|
|
void *out = realloc(*buffer, size);
|
|
if (out==NULL) {
|
|
OutputDebugString(L"realloc failed");
|
|
return false;
|
|
}
|
|
memcpy(out,data,size);
|
|
(*buffer)=out;
|
|
}
|
|
(*bufferLen)=size;
|
|
inmem->Release();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
void setBuffer(CMyDevice *device,IWDFIoRequest* pRequest,void *result,SIZE_T inSize) {
|
|
IWDFMemory *outmem=NULL;
|
|
pRequest->GetOutputMemory (&outmem);
|
|
if (outmem==NULL) {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
OutputDebugString(L"GetOutputMemory failed");
|
|
pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE));
|
|
}
|
|
else {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
outmem->CopyFromBuffer(0,result,inSize);
|
|
outmem->Release();
|
|
pRequest->CompleteWithInformation(0,(SIZE_T)inSize);
|
|
}
|
|
}
|
|
|
|
void setString(CMyDevice *device,IWDFIoRequest* pRequest,char *result,SIZE_T outSize) {
|
|
IWDFMemory *outmem=NULL;
|
|
pRequest->GetOutputMemory (&outmem);
|
|
if (outmem==NULL) {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
OutputDebugString(L"GetOutputMemory failed");
|
|
pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE));
|
|
}
|
|
else {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
SIZE_T size=min(outSize,strlen(result)+1);
|
|
outmem->CopyFromBuffer(0,result,size);
|
|
outmem->Release();
|
|
pRequest->CompleteWithInformation(0,(SIZE_T)size);
|
|
}
|
|
}
|
|
void setInt(CMyDevice *device,IWDFIoRequest* pRequest,DWORD result) {
|
|
IWDFMemory *outmem=NULL;
|
|
pRequest->GetOutputMemory (&outmem);
|
|
if (outmem==NULL) {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
OutputDebugString(L"GetOutputMemory failed");
|
|
pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE));
|
|
}
|
|
else {
|
|
SectionLocker lock(device->m_RequestLock);
|
|
outmem->CopyFromBuffer(0,&result,sizeof(result));
|
|
outmem->Release();
|
|
pRequest->CompleteWithInformation(0,sizeof(result));
|
|
}
|
|
}
|
|
DWORD getInt(IWDFIoRequest* pRequest) {
|
|
|
|
IWDFMemory *inmem=NULL;
|
|
pRequest->GetInputMemory(&inmem);
|
|
if (inmem==NULL) {
|
|
OutputDebugString(L"GetInputMemory failed");
|
|
return 0xffffffff;
|
|
}
|
|
else {
|
|
SIZE_T size;
|
|
void *data=inmem->GetDataBuffer(&size);
|
|
if (size<sizeof(DWORD)) {
|
|
OutputDebugString(L"Invalid input");
|
|
return 0xffffffff;
|
|
}
|
|
DWORD d=*(DWORD *)data;
|
|
inmem->Release();
|
|
return d;
|
|
}
|
|
}
|