Пример #1
0
//----------------------------------------------------------------
//  CImpIRestrictedProcess::RP_WahOpenHandleHelper()
//
//  In order to use WPUCreateSocketHandle(), this function must be
//  remoted because it creates a file handle...
//
//  BUGBUG: Make hSourceProcess and hTargetProcess part of the
//          object...
//----------------------------------------------------------------
STDMETHODIMP
CImpIRestrictedProcess::RP_WahOpenHandleHelper( IN  DWORD  dwTargetPid,
                                                OUT DWORD *pdwHelperHandle,
                                                OUT DWORD *pdwStatus )
    {
    BOOL      fInherit;
    DWORD     dwSourcePid;
    DWORD     dwAccess;
    DWORD     dwOptions;
    HANDLE    hSourceProcess;
    HANDLE    hSourceHandle;
    HANDLE    hTargetProcess;


    *pdwHelperHandle = 0;

    *pdwStatus = WahOpenHandleHelper(&m_hHelper);
    if (*pdwStatus)
        {
        return NOERROR;
        }

    // Get a handle to our own process (to be used by DuplicateHandle()).
    dwSourcePid = GetCurrentProcessId();
    hSourceProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, dwSourcePid );
    if (!hSourceProcess)
       {
       *pdwStatus = GetLastError();
       WahCloseHandleHelper(m_hHelper);
       m_hHelper = 0;
       return NOERROR;
       }

    // Get a handle to the restricted process
    hTargetProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, dwTargetPid );
    if (!hTargetProcess)
       {
       *pdwStatus = GetLastError();
       WahCloseHandleHelper(m_hHelper);
       m_hHelper = 0;
       CloseHandle(hSourceProcess);
       return NOERROR;
       }

    // Ok, duplicate the helper handle into the restricted client.
    dwAccess = 0;
    fInherit = FALSE;
    dwOptions = DUPLICATE_SAME_ACCESS;
    if (!DuplicateHandle(hSourceProcess,
                         (HANDLE)m_hHelper,
                         hTargetProcess,
                         (HANDLE*)pdwHelperHandle,
                         dwAccess,
                         fInherit,
                         dwOptions ))
       {
       *pdwStatus = GetLastError();
       WahCloseHandleHelper(m_hHelper);
       m_hHelper = 0;
       }
    else
       {
       m_hHelper = (HANDLE)*pdwHelperHandle;
       }

    // Done with the process handles.
    CloseHandle(hSourceProcess);
    CloseHandle(hTargetProcess);

    return NOERROR;
    }
Пример #2
0
//----------------------------------------------------------------
//  CImpIRestrictedProcess::RP_WahCreateSocketHandle()
//
//  In order to use WPUCreateSocketHandle(), this function must be
//  remoted because it creates a file handle...
//----------------------------------------------------------------
STDMETHODIMP
CImpIRestrictedProcess::RP_WahCreateSocketHandle( IN  DWORD  dwTargetPid,
                                                  IN  DWORD  dwHelperHandle,
                                                  OUT DWORD *pdwSocket,
                                                  OUT DWORD *pdwStatus )
    {
    BOOL      fInherit;
    DWORD     dwSourcePid;
    DWORD     dwAccess;
    DWORD     dwOptions;
    HANDLE    hSourceProcess;
    HANDLE    hSourceHandle;
    HANDLE    hTargetProcess;
    SOCKET    Socket;

    *pdwStatus = WahCreateSocketHandle( (HANDLE)m_hHelper,
                                        (SOCKET*)&Socket );
    if (*pdwStatus == NO_ERROR)
        {
        return NOERROR;
        }

    // Get a handle to our own process (to be used by DuplicateHandle()).
    dwSourcePid = GetCurrentProcessId();
    hSourceProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, dwSourcePid );
    if (!hSourceProcess)
       {
       *pdwStatus = GetLastError();
       WahCloseSocketHandle(m_hHelper,Socket);
       return NOERROR;
       }

    // Get a handle to the restricted process
    hTargetProcess = OpenProcess( PROCESS_DUP_HANDLE, TRUE, dwTargetPid );
    if (!hTargetProcess)
       {
       *pdwStatus = GetLastError();
       WahCloseSocketHandle(m_hHelper,Socket);
       CloseHandle(hSourceProcess);
       return NOERROR;
       }

    // Ok, duplicate the helper handle into the restricted client.
    dwAccess = 0;
    fInherit = FALSE;
    dwOptions = DUPLICATE_SAME_ACCESS;
    if (!DuplicateHandle(hSourceProcess,
                         (HANDLE)Socket,
                         hTargetProcess,
                         (HANDLE*)pdwSocket,
                         dwAccess,
                         fInherit,
                         dwOptions ))
       {
       *pdwStatus = GetLastError();
       }

    // Close local copies of the helper handle and the socket,
    // both of these are now in the child process.
    WahCloseSocketHandle(m_hHelper,Socket);
    WahCloseHandleHelper(m_hHelper);
    m_hHelper = 0;

    // Done with the process handles.
    CloseHandle(hSourceProcess);
    CloseHandle(hTargetProcess);

    return NOERROR;
    }
Пример #3
0
VOID
WSAAPI
WsProcDelete(IN PWSPROCESS Process)
{
    /* Check if we didn't even initialize yet */
    if (!Process->LockReady) return;

    /* No more current process */
    CurrentWsProcess = NULL;

    /* If we have a socket table */
    if (WsSockHandleTable)
    {
        /* Enumerate the sockets with a delete callback */
        WahEnumerateHandleContexts(WsSockHandleTable,
                                   WsSockDeleteSockets,
                                   Process);
    }

    /* Close APC Helper */
    if (Process->ApcHelper) WahCloseApcHelper(Process->ApcHelper);

    /* Close handle helper */
    if (Process->HandleHelper) WahCloseHandleHelper(Process->HandleHelper);

    /* Check for notification helper */
    if (Process->NotificationHelper)
    {
        /* Close notification helper */
        WahCloseNotificationHandleHelper(Process->NotificationHelper);
    }

    /* Check if we have a protocol catalog*/
    if (Process->ProtocolCatalog)
    {
        /* Enumerate it to clean it up */
        WsTcEnumerateCatalogItems(Process->ProtocolCatalog,
                                  CleanupProtocolProviders,
                                  NULL);

        /* Delete it */
        WsTcDelete(Process->ProtocolCatalog);
        Process->ProtocolCatalog = NULL;
    }

    /* Check if we have a namespace catalog*/
    if (Process->NamespaceCatalog)
    {
        /* Enumerate it to clean it up */
        WsNcEnumerateCatalogItems(Process->NamespaceCatalog,
                                  CleanupNamespaceProviders,
                                  NULL);

        /* Delete it */
        WsNcDelete(Process->NamespaceCatalog);
        Process->NamespaceCatalog = NULL;
    }

    /* Delete the thread lock */
    DeleteCriticalSection(&Process->ThreadLock);

    /* Delete us */
    HeapFree(WsSockHeap, 0, Process);
}