本文整理汇总了C++中AssertRC函数的典型用法代码示例。如果您正苦于以下问题:C++ AssertRC函数的具体用法?C++ AssertRC怎么用?C++ AssertRC使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了AssertRC函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DECLCALLBACK
/**
* A fallback method in case something goes wrong with the normal
* I/O manager.
*/
DECLCALLBACK(int) pdmacFileAioMgrFailsafe(RTTHREAD hThreadSelf, void *pvUser)
{
int rc = VINF_SUCCESS;
PPDMACEPFILEMGR pAioMgr = (PPDMACEPFILEMGR)pvUser;
NOREF(hThreadSelf);
while ( (pAioMgr->enmState == PDMACEPFILEMGRSTATE_RUNNING)
|| (pAioMgr->enmState == PDMACEPFILEMGRSTATE_SUSPENDING))
{
ASMAtomicWriteBool(&pAioMgr->fWaitingEventSem, true);
if (!ASMAtomicReadBool(&pAioMgr->fWokenUp))
rc = RTSemEventWait(pAioMgr->EventSem, pAioMgr->msBwLimitExpired);
ASMAtomicWriteBool(&pAioMgr->fWaitingEventSem, false);
Assert(RT_SUCCESS(rc) || rc == VERR_TIMEOUT);
LogFlow(("Got woken up\n"));
ASMAtomicWriteBool(&pAioMgr->fWokenUp, false);
/* Process endpoint events first. */
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpoint = pAioMgr->pEndpointsHead;
while (pEndpoint)
{
pAioMgr->msBwLimitExpired = RT_INDEFINITE_WAIT;
rc = pdmacFileAioMgrFailsafeProcessEndpoint(pAioMgr, pEndpoint);
AssertRC(rc);
pEndpoint = pEndpoint->AioMgr.pEndpointNext;
}
/* Now check for an external blocking event. */
if (pAioMgr->fBlockingEventPending)
{
switch (pAioMgr->enmBlockingEvent)
{
case PDMACEPFILEAIOMGRBLOCKINGEVENT_ADD_ENDPOINT:
{
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointNew = pAioMgr->BlockingEventData.AddEndpoint.pEndpoint;
AssertMsg(VALID_PTR(pEndpointNew), ("Adding endpoint event without a endpoint to add\n"));
pEndpointNew->enmState = PDMASYNCCOMPLETIONENDPOINTFILESTATE_ACTIVE;
pEndpointNew->AioMgr.pEndpointNext = pAioMgr->pEndpointsHead;
pEndpointNew->AioMgr.pEndpointPrev = NULL;
if (pAioMgr->pEndpointsHead)
pAioMgr->pEndpointsHead->AioMgr.pEndpointPrev = pEndpointNew;
pAioMgr->pEndpointsHead = pEndpointNew;
pAioMgr->cEndpoints++;
/*
* Process the task list the first time. There might be pending requests
* if the endpoint was migrated from another endpoint.
*/
rc = pdmacFileAioMgrFailsafeProcessEndpoint(pAioMgr, pEndpointNew);
AssertRC(rc);
break;
}
case PDMACEPFILEAIOMGRBLOCKINGEVENT_REMOVE_ENDPOINT:
{
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointRemove = pAioMgr->BlockingEventData.RemoveEndpoint.pEndpoint;
AssertMsg(VALID_PTR(pEndpointRemove), ("Removing endpoint event without a endpoint to remove\n"));
pEndpointRemove->enmState = PDMASYNCCOMPLETIONENDPOINTFILESTATE_REMOVING;
PPDMASYNCCOMPLETIONENDPOINTFILE pPrev = pEndpointRemove->AioMgr.pEndpointPrev;
PPDMASYNCCOMPLETIONENDPOINTFILE pNext = pEndpointRemove->AioMgr.pEndpointNext;
if (pPrev)
pPrev->AioMgr.pEndpointNext = pNext;
else
pAioMgr->pEndpointsHead = pNext;
if (pNext)
pNext->AioMgr.pEndpointPrev = pPrev;
pAioMgr->cEndpoints--;
break;
}
case PDMACEPFILEAIOMGRBLOCKINGEVENT_CLOSE_ENDPOINT:
{
PPDMASYNCCOMPLETIONENDPOINTFILE pEndpointClose = pAioMgr->BlockingEventData.CloseEndpoint.pEndpoint;
AssertMsg(VALID_PTR(pEndpointClose), ("Close endpoint event without a endpoint to Close\n"));
pEndpointClose->enmState = PDMASYNCCOMPLETIONENDPOINTFILESTATE_CLOSING;
/* Make sure all tasks finished. */
rc = pdmacFileAioMgrFailsafeProcessEndpoint(pAioMgr, pEndpointClose);
AssertRC(rc);
break;
}
case PDMACEPFILEAIOMGRBLOCKINGEVENT_SHUTDOWN:
pAioMgr->enmState = PDMACEPFILEMGRSTATE_SHUTDOWN;
break;
case PDMACEPFILEAIOMGRBLOCKINGEVENT_SUSPEND:
pAioMgr->enmState = PDMACEPFILEMGRSTATE_SUSPENDING;
break;
case PDMACEPFILEAIOMGRBLOCKINGEVENT_RESUME:
//.........这里部分代码省略.........
示例2: AssertPtrReturn
int GuestFile::onFileNotify(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData)
{
AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pSvcCbData, VERR_INVALID_POINTER);
LogFlowThisFuncEnter();
if (pSvcCbData->mParms < 3)
return VERR_INVALID_PARAMETER;
int vrc = VINF_SUCCESS;
int idx = 1; /* Current parameter index. */
CALLBACKDATA_FILE_NOTIFY dataCb;
/* pSvcCb->mpaParms[0] always contains the context ID. */
pSvcCbData->mpaParms[idx++].getUInt32(&dataCb.uType);
pSvcCbData->mpaParms[idx++].getUInt32(&dataCb.rc);
FileStatus_T fileStatus = FileStatus_Undefined;
int guestRc = (int)dataCb.rc; /* uint32_t vs. int. */
LogFlowFunc(("uType=%RU32, guestRc=%Rrc\n",
dataCb.uType, guestRc));
if (RT_FAILURE(guestRc))
{
int rc2 = setFileStatus(FileStatus_Error, guestRc);
AssertRC(rc2);
rc2 = signalWaitEventInternal(pCbCtx,
guestRc, NULL /* pPayload */);
AssertRC(rc2);
return VINF_SUCCESS; /* Report to the guest. */
}
switch (dataCb.uType)
{
case GUEST_FILE_NOTIFYTYPE_ERROR:
{
int rc2 = setFileStatus(FileStatus_Error, guestRc);
AssertRC(rc2);
break;
}
case GUEST_FILE_NOTIFYTYPE_OPEN:
{
if (pSvcCbData->mParms == 4)
{
pSvcCbData->mpaParms[idx++].getUInt32(&dataCb.u.open.uHandle);
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
AssertMsg(mData.mID == VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID),
("File ID %RU32 does not match context ID %RU32\n", mData.mID,
VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID)));
/* Set the initial offset. On the guest the whole opening operation
* would fail if an initial seek isn't possible. */
mData.mOffCurrent = mData.mOpenInfo.mInitialOffset;
}
/* Set the process status. */
int rc2 = setFileStatus(FileStatus_Open, guestRc);
AssertRC(rc2);
}
else
vrc = VERR_NOT_SUPPORTED;
break;
}
case GUEST_FILE_NOTIFYTYPE_CLOSE:
{
int rc2 = setFileStatus(FileStatus_Closed, guestRc);
AssertRC(rc2);
break;
}
case GUEST_FILE_NOTIFYTYPE_READ:
{
if (pSvcCbData->mParms == 4)
{
pSvcCbData->mpaParms[idx++].getPointer(&dataCb.u.read.pvData,
&dataCb.u.read.cbData);
uint32_t cbRead = dataCb.u.read.cbData;
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
mData.mOffCurrent += cbRead;
alock.release();
com::SafeArray<BYTE> data((size_t)cbRead);
data.initFrom((BYTE*)dataCb.u.read.pvData, cbRead);
fireGuestFileReadEvent(mEventSource, mSession, this, mData.mOffCurrent,
cbRead, ComSafeArrayAsInParam(data));
//.........这里部分代码省略.........
示例3: DECLINLINE
DECLINLINE(int) vboxPciVmLock(PVBOXRAWPCIDRVVM pThis)
{
int rc = RTSemFastMutexRequest(pThis->hFastMtx);
AssertRC(rc);
return rc;
}
示例4: DECLCALLBACK
/**
* @interface_method_impl{PDMINVRAMCONNECTOR,pfnVarStoreSeqPut}
*/
DECLCALLBACK(int) drvNvram_VarStoreSeqPut(PPDMINVRAMCONNECTOR pInterface, int idxVariable,
PCRTUUID pVendorUuid, const char *pszName, size_t cchName,
uint32_t fAttributes, uint8_t const *pbValue, size_t cbValue)
{
PNVRAM pThis = RT_FROM_MEMBER(pInterface, NVRAM, INvramConnector);
int rc = VINF_SUCCESS;
if (pThis->fPermanentSave && pThis->pNvram)
{
char szExtraName[256];
size_t offValueNm = RTStrPrintf(szExtraName, sizeof(szExtraName) - 16,
NVRAM_CFGM_OVERLAY_PATH "/%04u/", idxVariable);
char szUuid[RTUUID_STR_LENGTH];
int rc2 = RTUuidToStr(pVendorUuid, szUuid, sizeof(szUuid));
AssertRC(rc2);
char szAttribs[32];
if (fAttributes != NVRAM_DEFAULT_ATTRIB)
RTStrPrintf(szAttribs, sizeof(szAttribs), "%#x", fAttributes);
else
szAttribs[0] = '\0';
char *pszValue = drvNvram_binaryToCfgmString(pbValue, cbValue);
if (pszValue)
{
const char *apszTodo[] =
{
"Name", pszName,
"Uuid", szUuid,
"Value", pszValue,
"Attribs", szAttribs,
};
for (unsigned i = 0; i < RT_ELEMENTS(apszTodo); i += 2)
{
if (!apszTodo[i + 1][0])
continue;
Assert(strlen(apszTodo[i]) < 16);
strcpy(szExtraName + offValueNm, apszTodo[i]);
try
{
HRESULT hrc = pThis->pNvram->getParent()->i_machine()->SetExtraData(Bstr(szExtraName).raw(),
Bstr(apszTodo[i + 1]).raw());
if (FAILED(hrc))
{
LogRel(("drvNvram_deleteVar: SetExtraData(%s,%s) returned %Rhrc\n", szExtraName, apszTodo[i + 1], hrc));
rc = Global::vboxStatusCodeFromCOM(hrc);
}
}
catch (...)
{
LogRel(("drvNvram_deleteVar: SetExtraData(%s,%s) threw exception\n", szExtraName, apszTodo[i + 1]));
rc = VERR_UNEXPECTED_EXCEPTION;
}
}
}
else
rc = VERR_NO_MEMORY;
RTMemFree(pszValue);
}
NOREF(cchName);
LogFlowFuncLeaveRC(rc);
return rc;
}
示例5: main
int main(int argc, char **argv)
{
RTEXITCODE rcExit;
/*
* Init globals and such.
*/
int rc = RTR3InitExe(argc, &argv, 0);
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
g_pszProgName = RTPathFilename(argv[0]);
#ifdef DEBUG
rc = RTCritSectInit(&g_csLog);
AssertRC(rc);
#endif
#ifdef VBOXSERVICE_TOOLBOX
/*
* Run toolbox code before all other stuff since these things are simpler
* shell/file/text utility like programs that just happens to be inside
* VBoxService and shouldn't be subject to /dev/vboxguest, pid-files and
* global mutex restrictions.
*/
if (VBoxServiceToolboxMain(argc, argv, &rcExit))
return rcExit;
#endif
/*
* Connect to the kernel part before daemonizing so we can fail and
* complain if there is some kind of problem. We need to initialize the
* guest lib *before* we do the pre-init just in case one of services needs
* do to some initial stuff with it.
*/
VBoxServiceVerbose(2, "Calling VbgR3Init()\n");
rc = VbglR3Init();
if (RT_FAILURE(rc))
{
if (rc == VERR_ACCESS_DENIED)
return RTMsgErrorExit(RTEXITCODE_FAILURE, "Insufficient privileges to start %s! Please start with Administrator/root privileges!\n",
g_pszProgName);
return RTMsgErrorExit(RTEXITCODE_FAILURE, "VbglR3Init failed with rc=%Rrc\n", rc);
}
#ifdef RT_OS_WINDOWS
/*
* Check if we're the specially spawned VBoxService.exe process that
* handles page fusion. This saves an extra executable.
*/
if ( argc == 2
&& !strcmp(argv[1], "--pagefusionfork"))
return VBoxServicePageSharingInitFork();
#endif
char szLogFile[RTPATH_MAX + 128] = "";
/*
* Parse the arguments.
*
* Note! This code predates RTGetOpt, thus the manual parsing.
*/
bool fDaemonize = true;
bool fDaemonized = false;
for (int i = 1; i < argc; i++)
{
const char *psz = argv[i];
if (*psz != '-')
return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown argument '%s'\n", psz);
psz++;
/* translate long argument to short */
if (*psz == '-')
{
psz++;
size_t cch = strlen(psz);
#define MATCHES(strconst) ( cch == sizeof(strconst) - 1 \
&& !memcmp(psz, strconst, sizeof(strconst) - 1) )
if (MATCHES("foreground"))
psz = "f";
else if (MATCHES("verbose"))
psz = "v";
else if (MATCHES("version"))
psz = "V";
else if (MATCHES("help"))
psz = "h";
else if (MATCHES("interval"))
psz = "i";
#ifdef RT_OS_WINDOWS
else if (MATCHES("register"))
psz = "r";
else if (MATCHES("unregister"))
psz = "u";
#endif
else if (MATCHES("logfile"))
psz = "l";
else if (MATCHES("daemonized"))
{
fDaemonized = true;
continue;
}
else
//.........这里部分代码省略.........
示例6: vboxServiceWinCtrlHandler
static DWORD WINAPI vboxServiceWinCtrlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
#endif
{
DWORD rcRet = NO_ERROR;
#ifdef TARGET_NT4
VBoxServiceVerbose(2, "Control handler: Control=%#x\n", dwControl);
#else
VBoxServiceVerbose(2, "Control handler: Control=%#x, EventType=%#x\n", dwControl, dwEventType);
#endif
switch (dwControl)
{
case SERVICE_CONTROL_INTERROGATE:
vboxServiceWinSetStatus(g_dwWinServiceLastStatus, 0);
break;
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
{
vboxServiceWinSetStatus(SERVICE_STOP_PENDING, 0);
int rc2 = VBoxServiceStopServices();
if (RT_FAILURE(rc2))
rcRet = ERROR_GEN_FAILURE;
else
{
rc2 = VBoxServiceReportStatus(VBoxGuestFacilityStatus_Terminated);
AssertRC(rc2);
}
vboxServiceWinSetStatus(SERVICE_STOPPED, 0);
break;
}
# ifndef TARGET_NT4
case SERVICE_CONTROL_SESSIONCHANGE: /* Only Windows 2000 and up. */
{
AssertPtr(lpEventData);
PWTSSESSION_NOTIFICATION pNotify = (PWTSSESSION_NOTIFICATION)lpEventData;
Assert(pNotify->cbSize == sizeof(WTSSESSION_NOTIFICATION));
VBoxServiceVerbose(1, "Control handler: %s (Session=%ld, Event=%#x)\n",
vboxServiceWTSStateToString(dwEventType),
pNotify->dwSessionId, dwEventType);
/* Handle all events, regardless of dwEventType. */
int rc2 = VBoxServiceVMInfoSignal();
AssertRC(rc2);
break;
}
# endif /* !TARGET_NT4 */
default:
VBoxServiceVerbose(1, "Control handler: Function not implemented: %#x\n", dwControl);
rcRet = ERROR_CALL_NOT_IMPLEMENTED;
break;
}
#ifndef TARGET_NT4
return rcRet;
#endif
}
示例7: VBoxDbgBaseWindow
VBoxDbgConsole::VBoxDbgConsole(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent/* = NULL*/, IVirtualBox *a_pVirtualBox/* = NULL */)
: VBoxDbgBaseWindow(a_pDbgGui, a_pParent, "Console"), m_pOutput(NULL), m_pInput(NULL), m_fInputRestoreFocus(false),
m_pszInputBuf(NULL), m_cbInputBuf(0), m_cbInputBufAlloc(0),
m_pszOutputBuf(NULL), m_cbOutputBuf(0), m_cbOutputBufAlloc(0),
m_pTimer(NULL), m_fUpdatePending(false), m_Thread(NIL_RTTHREAD), m_EventSem(NIL_RTSEMEVENT),
m_fTerminate(false), m_fThreadTerminated(false)
{
/*
* Create the output text box.
*/
m_pOutput = new VBoxDbgConsoleOutput(this, a_pVirtualBox);
/* try figure a suitable size */
QLabel *pLabel = new QLabel( "11111111111111111111111111111111111111111111111111111111111111111111111111111112222222222", this);
pLabel->setFont(m_pOutput->font());
QSize Size = pLabel->sizeHint();
delete pLabel;
Size.setWidth((int)(Size.width() * 1.10));
Size.setHeight(Size.width() / 2);
resize(Size);
/*
* Create the input combo box (with a label).
*/
QHBoxLayout *pLayout = new QHBoxLayout();
//pLayout->setSizeConstraint(QLayout::SetMaximumSize);
pLabel = new QLabel(" Command ");
pLayout->addWidget(pLabel);
pLabel->setMaximumSize(pLabel->sizeHint());
pLabel->setAlignment(Qt::AlignCenter);
m_pInput = new VBoxDbgConsoleInput(NULL);
pLayout->addWidget(m_pInput);
m_pInput->setDuplicatesEnabled(false);
connect(m_pInput, SIGNAL(commandSubmitted(const QString &)), this, SLOT(commandSubmitted(const QString &)));
# if 0//def Q_WS_MAC
pLabel = new QLabel(" ");
pLayout->addWidget(pLabel);
pLabel->setMaximumSize(20, m_pInput->sizeHint().height() + 6);
pLabel->setMinimumSize(20, m_pInput->sizeHint().height() + 6);
# endif
QWidget *pHBox = new QWidget(this);
pHBox->setLayout(pLayout);
m_pInput->setEnabled(false); /* (we'll get a ready notification) */
/*
* Vertical layout box on the whole widget.
*/
QVBoxLayout *pVLayout = new QVBoxLayout();
pVLayout->setContentsMargins(0, 0, 0, 0);
pVLayout->setSpacing(5);
pVLayout->addWidget(m_pOutput);
pVLayout->addWidget(pHBox);
setLayout(pVLayout);
/*
* The tab order is from input to output, not the other way around as it is by default.
*/
setTabOrder(m_pInput, m_pOutput);
m_fInputRestoreFocus = true; /* hack */
/*
* Setup the timer.
*/
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), SLOT(updateOutput()));
/*
* Init the backend structure.
*/
m_Back.Core.pfnInput = backInput;
m_Back.Core.pfnRead = backRead;
m_Back.Core.pfnWrite = backWrite;
m_Back.Core.pfnSetReady = backSetReady;
m_Back.pSelf = this;
/*
* Create the critical section, the event semaphore and the debug console thread.
*/
int rc = RTCritSectInit(&m_Lock);
AssertRC(rc);
rc = RTSemEventCreate(&m_EventSem);
AssertRC(rc);
rc = RTThreadCreate(&m_Thread, backThread, this, 0, RTTHREADTYPE_DEBUGGER, RTTHREADFLAGS_WAITABLE, "VBoxDbgC");
AssertRC(rc);
if (RT_FAILURE(rc))
m_Thread = NIL_RTTHREAD;
/*
* Shortcuts.
*/
m_pFocusToInput = new QAction("", this);
m_pFocusToInput->setShortcut(QKeySequence("Ctrl+L"));
//.........这里部分代码省略.........
示例8: parallel_ioport_read
static uint32_t parallel_ioport_read(void *opaque, uint32_t addr, int *pRC)
{
ParallelState *s = (ParallelState *)opaque;
uint32_t ret = ~0U;
*pRC = VINF_SUCCESS;
addr &= 7;
switch(addr) {
default:
case 0:
if (!(s->reg_control & LPT_CONTROL_ENABLE_BIDIRECT))
ret = s->reg_data;
else
{
#ifndef IN_RING3
*pRC = VINF_IOM_HC_IOPORT_READ;
#else
if (RT_LIKELY(s->pDrvHostParallelConnector))
{
size_t cbRead;
int rc = s->pDrvHostParallelConnector->pfnRead(s->pDrvHostParallelConnector, &s->reg_data, &cbRead);
Log(("parallel_io_port_read: read 0x%X\n", s->reg_data));
AssertRC(rc);
}
ret = s->reg_data;
#endif
}
break;
case 1:
#ifndef IN_RING3
*pRC = VINF_IOM_HC_IOPORT_READ;
#else
if (RT_LIKELY(s->pDrvHostParallelConnector))
{
int rc = s->pDrvHostParallelConnector->pfnReadStatus(s->pDrvHostParallelConnector, &s->reg_status);
AssertRC(rc);
}
ret = s->reg_status;
parallel_clear_irq(s);
#endif
break;
case 2:
ret = s->reg_control;
break;
case 3:
ret = s->reg_epp_addr;
break;
case 4:
ret = s->reg_epp_data;
break;
case 5:
break;
case 6:
break;
case 7:
break;
}
LogFlow(("parallel: read addr=0x%02x val=0x%02x\n", addr, ret));
return ret;
}
示例9: VGSvcWinResolveApis
/**
* Resolve APIs not present on older windows versions.
*/
void VGSvcWinResolveApis(void)
{
RTLDRMOD hLdrMod;
#define RESOLVE_SYMBOL(a_fn) do { RT_CONCAT(g_pfn, a_fn) = (decltype(a_fn) *)RTLdrGetFunction(hLdrMod, #a_fn); } while (0)
/* From ADVAPI32.DLL: */
int rc = RTLdrLoadSystem("advapi32.dll", true /*fNoUnload*/, &hLdrMod);
AssertRC(rc);
if (RT_SUCCESS(rc))
{
RESOLVE_SYMBOL(RegisterServiceCtrlHandlerExA);
RESOLVE_SYMBOL(ChangeServiceConfig2A);
RESOLVE_SYMBOL(GetNamedSecurityInfoA);
RESOLVE_SYMBOL(SetEntriesInAclA);
RESOLVE_SYMBOL(SetNamedSecurityInfoA);
RESOLVE_SYMBOL(LsaNtStatusToWinError);
RTLdrClose(hLdrMod);
}
/* From KERNEL32.DLL: */
rc = RTLdrLoadSystem("kernel32.dll", true /*fNoUnload*/, &hLdrMod);
AssertRC(rc);
if (RT_SUCCESS(rc))
{
RESOLVE_SYMBOL(CreateToolhelp32Snapshot);
RESOLVE_SYMBOL(Process32First);
RESOLVE_SYMBOL(Process32Next);
RESOLVE_SYMBOL(Module32First);
RESOLVE_SYMBOL(Module32Next);
RESOLVE_SYMBOL(GetSystemTimeAdjustment);
RESOLVE_SYMBOL(SetSystemTimeAdjustment);
RTLdrClose(hLdrMod);
}
/* From NTDLL.DLL: */
rc = RTLdrLoadSystem("ntdll.dll", true /*fNoUnload*/, &hLdrMod);
AssertRC(rc);
if (RT_SUCCESS(rc))
{
RESOLVE_SYMBOL(ZwQuerySystemInformation);
RTLdrClose(hLdrMod);
}
/* From IPHLPAPI.DLL: */
rc = RTLdrLoadSystem("iphlpapi.dll", true /*fNoUnload*/, &hLdrMod);
if (RT_SUCCESS(rc))
{
RESOLVE_SYMBOL(GetAdaptersInfo);
RTLdrClose(hLdrMod);
}
/* From WS2_32.DLL: */
rc = RTLdrLoadSystem("ws2_32.dll", true /*fNoUnload*/, &hLdrMod);
if (RT_SUCCESS(rc))
{
RESOLVE_SYMBOL(WSAStartup);
RESOLVE_SYMBOL(WSACleanup);
RESOLVE_SYMBOL(WSASocketA);
RESOLVE_SYMBOL(WSAIoctl);
RESOLVE_SYMBOL(WSAGetLastError);
RESOLVE_SYMBOL(closesocket);
RESOLVE_SYMBOL(inet_ntoa);
RTLdrClose(hLdrMod);
}
}
示例10: RTDECL
RTDECL(int) RTUriFileCreateEx(const char *pszPath, uint32_t fPathStyle, char **ppszUri, size_t cbUri, size_t *pcchUri)
{
/*
* Validate and adjust input. (RTPathParse check pszPath out for us)
*/
if (pcchUri)
{
AssertPtrReturn(pcchUri, VERR_INVALID_POINTER);
*pcchUri = ~(size_t)0;
}
AssertPtrReturn(ppszUri, VERR_INVALID_POINTER);
AssertReturn(!(fPathStyle & ~RTPATH_STR_F_STYLE_MASK) && fPathStyle != RTPATH_STR_F_STYLE_RESERVED, VERR_INVALID_FLAGS);
if (fPathStyle == RTPATH_STR_F_STYLE_HOST)
fPathStyle = RTPATH_STYLE;
/*
* Let the RTPath code parse the stuff (no reason to duplicate path parsing
* and get it slightly wrong here).
*/
RTPATHPARSED ParsedPath;
int rc = RTPathParse(pszPath, &ParsedPath, sizeof(ParsedPath), fPathStyle);
if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW)
{
/* Skip leading slashes. */
if (ParsedPath.fProps & RTPATH_PROP_ROOT_SLASH)
{
if (fPathStyle == RTPATH_STR_F_STYLE_DOS)
while (pszPath[0] == '/' || pszPath[0] == '\\')
pszPath++;
else
while (pszPath[0] == '/')
pszPath++;
}
const size_t cchPath = strlen(pszPath);
/*
* Calculate the encoded length and figure destination buffering.
*/
static const char s_szPrefix[] = "file:///";
size_t const cchPrefix = sizeof(s_szPrefix) - (ParsedPath.fProps & RTPATH_PROP_UNC ? 2 : 1);
size_t cchEncoded = rtUriCalcEncodedLength(pszPath, cchPath, fPathStyle != RTPATH_STR_F_STYLE_DOS);
if (pcchUri)
*pcchUri = cchEncoded;
char *pszDst;
char *pszFreeMe = NULL;
if (!cbUri || *ppszUri == NULL)
{
cbUri = RT_MAX(cbUri, cchPrefix + cchEncoded + 1);
*ppszUri = pszFreeMe = pszDst = RTStrAlloc(cbUri);
AssertReturn(pszDst, VERR_NO_STR_MEMORY);
}
else if (cchEncoded < cbUri)
pszDst = *ppszUri;
else
return VERR_BUFFER_OVERFLOW;
/*
* Construct the URI.
*/
memcpy(pszDst, s_szPrefix, cchPrefix);
pszDst[cchPrefix] = '\0';
rc = rtUriEncodeIntoBuffer(pszPath, cchPath, fPathStyle != RTPATH_STR_F_STYLE_DOS, &pszDst[cchPrefix], cbUri - cchPrefix);
if (RT_SUCCESS(rc))
{
Assert(strlen(pszDst) == cbUri - 1);
if (fPathStyle == RTPATH_STR_F_STYLE_DOS)
RTPathChangeToUnixSlashes(pszDst, true /*fForce*/);
return VINF_SUCCESS;
}
AssertRC(rc); /* Impossible! rtUriCalcEncodedLength or something above is busted! */
if (pszFreeMe)
RTStrFree(pszFreeMe);
}
return rc;
}
示例11: DECLCALLBACK
/**
* Open a USB device and create a backend instance for it.
*
* @returns VBox status code.
*/
static DECLCALLBACK(int) usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
{
PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
int rc = VINF_SUCCESS;
pPriv->cAllocatedUrbs = 32;
pPriv->paHandles = (PHANDLE)RTMemAllocZ(sizeof(pPriv->paHandles[0]) * pPriv->cAllocatedUrbs);
pPriv->paQueuedUrbs = (PQUEUED_URB *)RTMemAllocZ(sizeof(pPriv->paQueuedUrbs[0]) * pPriv->cAllocatedUrbs);
if ( pPriv->paQueuedUrbs
&& pPriv->paHandles)
{
/*
* Open the device.
*/
pPriv->hDev = CreateFile(pszAddress,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL, // no SECURITY_ATTRIBUTES structure
OPEN_EXISTING, // No special create flags
FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, // overlapped IO
NULL); // No template file
if (pPriv->hDev != INVALID_HANDLE_VALUE)
{
Log(("usbProxyWinOpen: hDev=%p\n", pPriv->hDev));
/*
* Check the version
*/
USBSUP_VERSION version = {0};
DWORD cbReturned = 0;
if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_GET_VERSION, NULL, 0, &version, sizeof(version), &cbReturned, NULL))
{
if (!( version.u32Major != USBDRV_MAJOR_VERSION
|| version.u32Minor < USBDRV_MINOR_VERSION))
{
USBSUP_CLAIMDEV in;
in.bInterfaceNumber = 0;
cbReturned = 0;
if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_CLAIM_DEVICE, &in, sizeof(in), &in, sizeof(in), &cbReturned, NULL))
{
if (in.fClaimed)
{
pPriv->fClaimed = true;
#if 0 /** @todo this needs to be enabled if windows chooses a default config. Test with the TrekStor GO Stick. */
pProxyDev->iActiveCfg = 1;
pProxyDev->cIgnoreSetConfigs = 1;
#endif
rc = RTCritSectInit(&pPriv->CritSect);
AssertRC(rc);
pPriv->hEventWakeup = CreateEvent(NULL, FALSE, FALSE, NULL);
Assert(pPriv->hEventWakeup);
pPriv->paHandles[0] = pPriv->hEventWakeup;
return VINF_SUCCESS;
}
rc = VERR_GENERAL_FAILURE;
Log(("usbproxy: unable to claim device %x (%s)!!\n", pPriv->hDev, pszAddress));
}
}
else
{
rc = VERR_VERSION_MISMATCH;
Log(("usbproxy: Version mismatch: %d.%d != %d.%d (cur)\n",
version.u32Major, version.u32Minor, USBDRV_MAJOR_VERSION, USBDRV_MINOR_VERSION));
}
}
/* Convert last error if necessary */
if (RT_SUCCESS(rc))
{
DWORD dwErr = GetLastError();
Log(("usbproxy: last error %d\n", dwErr));
rc = RTErrConvertFromWin32(dwErr);
}
CloseHandle(pPriv->hDev);
pPriv->hDev = INVALID_HANDLE_VALUE;
}
else
{
Log(("usbproxy: FAILED to open '%s'! last error %d\n", pszAddress, GetLastError()));
rc = VERR_FILE_NOT_FOUND;
}
}
else
rc = VERR_NO_MEMORY;
RTMemFree(pPriv->paQueuedUrbs);
RTMemFree(pPriv->paHandles);
return rc;
}
示例12: VMMDECL
/**
* Leaves a critical section entered with PDMCritSectEnter().
*
* @returns Indication whether we really exited the critical section.
* @retval VINF_SUCCESS if we really exited.
* @retval VINF_SEM_NESTED if we only reduced the nesting count.
* @retval VERR_NOT_OWNER if you somehow ignore release assertions.
*
* @param pCritSect The PDM critical section to leave.
*/
VMMDECL(int) PDMCritSectLeave(PPDMCRITSECT pCritSect)
{
AssertMsg(pCritSect->s.Core.u32Magic == RTCRITSECT_MAGIC, ("%p %RX32\n", pCritSect, pCritSect->s.Core.u32Magic));
Assert(pCritSect->s.Core.u32Magic == RTCRITSECT_MAGIC);
/* Check for NOP sections before asserting ownership. */
if (pCritSect->s.Core.fFlags & RTCRITSECT_FLAGS_NOP)
return VINF_SUCCESS;
/*
* Always check that the caller is the owner (screw performance).
*/
RTNATIVETHREAD const hNativeSelf = pdmCritSectGetNativeSelf(pCritSect);
AssertReleaseMsgReturn(pCritSect->s.Core.NativeThreadOwner == hNativeSelf,
("%p %s: %p != %p; cLockers=%d cNestings=%d\n", pCritSect, R3STRING(pCritSect->s.pszName),
pCritSect->s.Core.NativeThreadOwner, hNativeSelf,
pCritSect->s.Core.cLockers, pCritSect->s.Core.cNestings),
VERR_NOT_OWNER);
Assert(pCritSect->s.Core.cNestings >= 1);
/*
* Nested leave.
*/
if (pCritSect->s.Core.cNestings > 1)
{
ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
Assert(pCritSect->s.Core.cNestings >= 1);
ASMAtomicDecS32(&pCritSect->s.Core.cLockers);
Assert(pCritSect->s.Core.cLockers >= 0);
return VINF_SEM_NESTED;
}
#ifdef IN_RING0
# if 0 /** @todo Make SUPSemEventSignal interrupt safe (handle table++) and enable this for: defined(RT_OS_LINUX) || defined(RT_OS_OS2) */
if (1) /* SUPSemEventSignal is safe */
# else
if (ASMIntAreEnabled())
# endif
#endif
#if defined(IN_RING3) || defined(IN_RING0)
{
/*
* Leave for real.
*/
/* update members. */
SUPSEMEVENT hEventToSignal = pCritSect->s.hEventToSignal;
pCritSect->s.hEventToSignal = NIL_SUPSEMEVENT;
# ifdef IN_RING3
# if defined(PDMCRITSECT_STRICT)
if (pCritSect->s.Core.pValidatorRec->hThread != NIL_RTTHREAD)
RTLockValidatorRecExclReleaseOwnerUnchecked(pCritSect->s.Core.pValidatorRec);
# endif
Assert(!pCritSect->s.Core.pValidatorRec || pCritSect->s.Core.pValidatorRec->hThread == NIL_RTTHREAD);
# endif
ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD);
ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
Assert(pCritSect->s.Core.cNestings == 0);
/* stop and decrement lockers. */
STAM_PROFILE_ADV_STOP(&pCritSect->s.StatLocked, l);
ASMCompilerBarrier();
if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) >= 0)
{
/* Someone is waiting, wake up one of them. */
SUPSEMEVENT hEvent = (SUPSEMEVENT)pCritSect->s.Core.EventSem;
PSUPDRVSESSION pSession = pCritSect->s.CTX_SUFF(pVM)->pSession;
int rc = SUPSemEventSignal(pSession, hEvent);
AssertRC(rc);
}
/* Signal exit event. */
if (hEventToSignal != NIL_SUPSEMEVENT)
{
Log8(("Signalling %#p\n", hEventToSignal));
int rc = SUPSemEventSignal(pCritSect->s.CTX_SUFF(pVM)->pSession, hEventToSignal);
AssertRC(rc);
}
# if defined(DEBUG_bird) && defined(IN_RING0)
VMMTrashVolatileXMMRegs();
# endif
}
#endif /* IN_RING3 || IN_RING0 */
#ifdef IN_RING0
else
#endif
#if defined(IN_RING0) || defined(IN_RC)
{
/*
//.........这里部分代码省略.........
示例13: VMMR3DECL
/**
* Deregister one(/all) info handler(s) owned by a driver.
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
* @param pDrvIns Driver instance.
* @param pszName The identifier of the info. If NULL all owned by the driver.
*/
VMMR3DECL(int) DBGFR3InfoDeregisterDriver(PVM pVM, PPDMDRVINS pDrvIns, const char *pszName)
{
LogFlow(("DBGFR3InfoDeregisterDriver: pDrvIns=%p pszName=%p:{%s}\n", pDrvIns, pszName, pszName));
/*
* Validate input.
*/
if (!pDrvIns)
{
AssertMsgFailed(("!pDrvIns\n"));
return VERR_INVALID_PARAMETER;
}
size_t cchName = pszName ? strlen(pszName) : 0;
/*
* Enumerate the info handlers and free the requested entries.
*/
int rc = RTCritSectEnter(&pVM->dbgf.s.InfoCritSect);
AssertRC(rc);
rc = VERR_FILE_NOT_FOUND;
PDBGFINFO pPrev = NULL;
PDBGFINFO pInfo = pVM->dbgf.s.pInfoFirst;
if (pszName)
{
/*
* Free a specific one.
*/
for (; pInfo; pPrev = pInfo, pInfo = pInfo->pNext)
if ( pInfo->enmType == DBGFINFOTYPE_DRV
&& pInfo->u.Drv.pDrvIns == pDrvIns
&& pInfo->cchName == cchName
&& !strcmp(pInfo->szName, pszName))
{
if (pPrev)
pPrev->pNext = pInfo->pNext;
else
pVM->dbgf.s.pInfoFirst = pInfo->pNext;
MMR3HeapFree(pInfo);
rc = VINF_SUCCESS;
break;
}
}
else
{
/*
* Free all owned by the driver.
*/
for (; pInfo; pPrev = pInfo, pInfo = pInfo->pNext)
if ( pInfo->enmType == DBGFINFOTYPE_DRV
&& pInfo->u.Drv.pDrvIns == pDrvIns)
{
if (pPrev)
pPrev->pNext = pInfo->pNext;
else
pVM->dbgf.s.pInfoFirst = pInfo->pNext;
MMR3HeapFree(pInfo);
pInfo = pPrev;
}
rc = VINF_SUCCESS;
}
int rc2 = RTCritSectLeave(&pVM->dbgf.s.InfoCritSect);
AssertRC(rc2);
AssertRC(rc);
LogFlow(("DBGFR3InfoDeregisterDriver: returns %Rrc\n", rc));
return rc;
}
示例14: DECLEXPORT
/**
* Entry point.
*/
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
{
int rcRet = 0; /* error count */
PPDMASYNCCOMPLETIONENDPOINT pEndpointSrc, pEndpointDst;
RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB);
if (argc != 3)
{
RTPrintf(TESTCASE ": Usage is ./tstPDMAsyncCompletion <source> <dest>\n");
return 1;
}
PVM pVM;
PUVM pUVM;
int rc = VMR3Create(1, NULL, NULL, NULL, NULL, NULL, &pVM, &pUVM);
if (RT_SUCCESS(rc))
{
/*
* Little hack to avoid the VM_ASSERT_EMT assertion.
*/
RTTlsSet(pVM->pUVM->vm.s.idxTLS, &pVM->pUVM->aCpus[0]);
pVM->pUVM->aCpus[0].pUVM = pVM->pUVM;
pVM->pUVM->aCpus[0].vm.s.NativeThreadEMT = RTThreadNativeSelf();
/*
* Create the template.
*/
PPDMASYNCCOMPLETIONTEMPLATE pTemplate;
rc = PDMR3AsyncCompletionTemplateCreateInternal(pVM, &pTemplate, AsyncTaskCompleted, NULL, "Test");
if (RT_FAILURE(rc))
{
RTPrintf(TESTCASE ": Error while creating the template!! rc=%d\n", rc);
return 1;
}
/*
* Create event semaphore.
*/
rc = RTSemEventCreate(&g_FinishedEventSem);
AssertRC(rc);
/*
* Create the temporary buffers.
*/
for (unsigned i=0; i < NR_TASKS; i++)
{
g_AsyncCompletionTasksBuffer[i] = (uint8_t *)RTMemAllocZ(BUFFER_SIZE);
if (!g_AsyncCompletionTasksBuffer[i])
{
RTPrintf(TESTCASE ": out of memory!\n");
return ++rcRet;
}
}
/* Create the destination as the async completion API can't do this. */
RTFILE FileTmp;
rc = RTFileOpen(&FileTmp, argv[2], RTFILE_O_READWRITE | RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_NONE);
if (RT_FAILURE(rc))
{
RTPrintf(TESTCASE ": Error while creating the destination!! rc=%d\n", rc);
return ++rcRet;
}
RTFileClose(FileTmp);
/* Create our file endpoint */
rc = PDMR3AsyncCompletionEpCreateForFile(&pEndpointSrc, argv[1], 0, pTemplate);
if (RT_SUCCESS(rc))
{
rc = PDMR3AsyncCompletionEpCreateForFile(&pEndpointDst, argv[2], 0, pTemplate);
if (RT_SUCCESS(rc))
{
PDMR3PowerOn(pVM);
/* Wait for all threads to finish initialization. */
RTThreadSleep(100);
int fReadPass = true;
uint64_t cbSrc;
size_t offSrc = 0;
size_t offDst = 0;
uint32_t cTasksUsed = 0;
rc = PDMR3AsyncCompletionEpGetSize(pEndpointSrc, &cbSrc);
if (RT_SUCCESS(rc))
{
/* Copy the data. */
for (;;)
{
if (fReadPass)
{
cTasksUsed = (BUFFER_SIZE * NR_TASKS) <= (cbSrc - offSrc)
? NR_TASKS
: ((cbSrc - offSrc) / BUFFER_SIZE)
+ ((cbSrc - offSrc) % BUFFER_SIZE) > 0
? 1
: 0;
//.........这里部分代码省略.........
示例15: DECLCALLBACK
/**
* Worker for DBGFR3Info and DBGFR3InfoEx.
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
* @param idCpu Which CPU to run EMT bound handlers on.
* VMCPUID_ANY or a valid CPU ID.
* @param pszName What to dump.
* @param pszArgs Arguments, optional.
* @param pHlp Output helper, optional.
*/
static DECLCALLBACK(int) dbgfR3Info(PVM pVM, VMCPUID idCpu, const char *pszName, const char *pszArgs, PCDBGFINFOHLP pHlp)
{
/*
* Validate input.
*/
AssertPtrReturn(pszName, VERR_INVALID_POINTER);
if (pHlp)
{
if ( !pHlp->pfnPrintf
|| !pHlp->pfnPrintfV)
{
AssertMsgFailed(("A pHlp member is missing!\n"));
return VERR_INVALID_PARAMETER;
}
}
else
pHlp = &g_dbgfR3InfoLogHlp;
/*
* Find the info handler.
*/
size_t cchName = strlen(pszName);
int rc = RTCritSectEnter(&pVM->dbgf.s.InfoCritSect);
AssertRC(rc);
PDBGFINFO pInfo = pVM->dbgf.s.pInfoFirst;
for (; pInfo; pInfo = pInfo->pNext)
if ( pInfo->cchName == cchName
&& !memcmp(pInfo->szName, pszName, cchName))
break;
if (pInfo)
{
/*
* Found it.
* Make a copy of it on the stack so we can leave the crit sect.
* Switch on the type and invoke the handler.
*/
DBGFINFO Info = *pInfo;
rc = RTCritSectLeave(&pVM->dbgf.s.InfoCritSect);
AssertRC(rc);
rc = VINF_SUCCESS;
switch (Info.enmType)
{
case DBGFINFOTYPE_DEV:
if (Info.fFlags & DBGFINFO_FLAGS_RUN_ON_EMT)
rc = VMR3ReqCallVoidWait(pVM, idCpu, (PFNRT)Info.u.Dev.pfnHandler, 3, Info.u.Dev.pDevIns, pHlp, pszArgs);
else
Info.u.Dev.pfnHandler(Info.u.Dev.pDevIns, pHlp, pszArgs);
break;
case DBGFINFOTYPE_DRV:
if (Info.fFlags & DBGFINFO_FLAGS_RUN_ON_EMT)
rc = VMR3ReqCallVoidWait(pVM, idCpu, (PFNRT)Info.u.Drv.pfnHandler, 3, Info.u.Drv.pDrvIns, pHlp, pszArgs);
else
Info.u.Drv.pfnHandler(Info.u.Drv.pDrvIns, pHlp, pszArgs);
break;
case DBGFINFOTYPE_INT:
if (Info.fFlags & DBGFINFO_FLAGS_RUN_ON_EMT)
rc = VMR3ReqCallVoidWait(pVM, idCpu, (PFNRT)Info.u.Int.pfnHandler, 3, pVM, pHlp, pszArgs);
else
Info.u.Int.pfnHandler(pVM, pHlp, pszArgs);
break;
case DBGFINFOTYPE_EXT:
if (Info.fFlags & DBGFINFO_FLAGS_RUN_ON_EMT)
rc = VMR3ReqCallVoidWait(pVM, idCpu, (PFNRT)Info.u.Ext.pfnHandler, 3, Info.u.Ext.pvUser, pHlp, pszArgs);
else
Info.u.Ext.pfnHandler(Info.u.Ext.pvUser, pHlp, pszArgs);
break;
default:
AssertMsgFailedReturn(("Invalid info type enmType=%d\n", Info.enmType), VERR_IPE_NOT_REACHED_DEFAULT_CASE);
}
}
else
{
rc = RTCritSectLeave(&pVM->dbgf.s.InfoCritSect);
AssertRC(rc);
rc = VERR_FILE_NOT_FOUND;
}
return rc;
}