localspl: Implement OpenPort and ClosePort.
This commit is contained in:
parent
278cc8e28d
commit
eff9c9ef0c
|
@ -42,6 +42,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(localspl);
|
||||||
|
|
||||||
/*****************************************************/
|
/*****************************************************/
|
||||||
|
|
||||||
|
static CRITICAL_SECTION port_handles_cs;
|
||||||
|
static CRITICAL_SECTION_DEBUG port_handles_cs_debug =
|
||||||
|
{
|
||||||
|
0, 0, &port_handles_cs,
|
||||||
|
{ &port_handles_cs_debug.ProcessLocksList, &port_handles_cs_debug.ProcessLocksList },
|
||||||
|
0, 0, { (DWORD_PTR)(__FILE__ ": port_handles_cs") }
|
||||||
|
};
|
||||||
|
static CRITICAL_SECTION port_handles_cs = { &port_handles_cs_debug, -1, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
|
||||||
static CRITICAL_SECTION xcv_handles_cs;
|
static CRITICAL_SECTION xcv_handles_cs;
|
||||||
static CRITICAL_SECTION_DEBUG xcv_handles_cs_debug =
|
static CRITICAL_SECTION_DEBUG xcv_handles_cs_debug =
|
||||||
{
|
{
|
||||||
|
@ -53,12 +63,19 @@ static CRITICAL_SECTION xcv_handles_cs = { &xcv_handles_cs_debug, -1, 0, 0, 0, 0
|
||||||
|
|
||||||
/* ############################### */
|
/* ############################### */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct list entry;
|
||||||
|
DWORD type;
|
||||||
|
WCHAR nameW[1];
|
||||||
|
} port_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct list entry;
|
struct list entry;
|
||||||
ACCESS_MASK GrantedAccess;
|
ACCESS_MASK GrantedAccess;
|
||||||
WCHAR nameW[1];
|
WCHAR nameW[1];
|
||||||
} xcv_t;
|
} xcv_t;
|
||||||
|
|
||||||
|
static struct list port_handles = LIST_INIT( port_handles );
|
||||||
static struct list xcv_handles = LIST_INIT( xcv_handles );
|
static struct list xcv_handles = LIST_INIT( xcv_handles );
|
||||||
|
|
||||||
/* ############################### */
|
/* ############################### */
|
||||||
|
@ -299,6 +316,45 @@ static DWORD get_type_from_name(LPCWSTR name)
|
||||||
return PORT_IS_UNKNOWN;
|
return PORT_IS_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* get_type_from_local_name (internal)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static DWORD get_type_from_local_name(LPCWSTR nameW)
|
||||||
|
{
|
||||||
|
LPPORT_INFO_1W pi;
|
||||||
|
LPWSTR myname = NULL;
|
||||||
|
DWORD needed = 0;
|
||||||
|
DWORD numentries = 0;
|
||||||
|
DWORD id = 0;
|
||||||
|
|
||||||
|
TRACE("(%s)\n", debugstr_w(myname));
|
||||||
|
|
||||||
|
needed = get_ports_from_reg(1, NULL, 0, &numentries);
|
||||||
|
pi = spl_alloc(needed);
|
||||||
|
if (pi)
|
||||||
|
needed = get_ports_from_reg(1, (LPBYTE) pi, needed, &numentries);
|
||||||
|
|
||||||
|
if (pi && needed && numentries > 0) {
|
||||||
|
/* we got a number of valid ports. */
|
||||||
|
|
||||||
|
while ((myname == NULL) && (id < numentries))
|
||||||
|
{
|
||||||
|
if (lstrcmpiW(nameW, pi[id].pName) == 0) {
|
||||||
|
TRACE("(%u) found %s\n", id, debugstr_w(pi[id].pName));
|
||||||
|
myname = pi[id].pName;
|
||||||
|
}
|
||||||
|
id++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
id = (myname) ? get_type_from_name(myname) : PORT_IS_UNKNOWN;
|
||||||
|
|
||||||
|
spl_free(pi);
|
||||||
|
return id;
|
||||||
|
|
||||||
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* localmon_AddPortExW [exported through MONITOREX]
|
* localmon_AddPortExW [exported through MONITOREX]
|
||||||
*
|
*
|
||||||
|
@ -356,6 +412,31 @@ static BOOL WINAPI localmon_AddPortExW(LPWSTR pName, DWORD level, LPBYTE pBuffer
|
||||||
return (res == ERROR_SUCCESS);
|
return (res == ERROR_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* localmon_ClosePort [exported through MONITOREX]
|
||||||
|
*
|
||||||
|
* Close a
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* hPort [i] The Handle to close
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: TRUE
|
||||||
|
* Failure: FALSE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static BOOL WINAPI localmon_ClosePort(HANDLE hPort)
|
||||||
|
{
|
||||||
|
port_t * port = (port_t *) hPort;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", port);
|
||||||
|
EnterCriticalSection(&port_handles_cs);
|
||||||
|
list_remove(&port->entry);
|
||||||
|
LeaveCriticalSection(&port_handles_cs);
|
||||||
|
spl_free(port);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* localmon_EnumPortsW [exported through MONITOREX]
|
* localmon_EnumPortsW [exported through MONITOREX]
|
||||||
*
|
*
|
||||||
|
@ -415,6 +496,51 @@ cleanup:
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* localmon_OpenPort [exported through MONITOREX]
|
||||||
|
*
|
||||||
|
* Open a Data-Channel for a Port
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* pName [i] Name of selected Object
|
||||||
|
* phPort [o] The resulting Handle is stored here
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: TRUE
|
||||||
|
* Failure: FALSE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static BOOL WINAPI localmon_OpenPortW(LPWSTR pName, PHANDLE phPort)
|
||||||
|
{
|
||||||
|
port_t * port;
|
||||||
|
DWORD len;
|
||||||
|
DWORD type;
|
||||||
|
|
||||||
|
TRACE("%s, %p)\n", debugstr_w(pName), phPort);
|
||||||
|
|
||||||
|
/* an empty name is invalid */
|
||||||
|
if (!pName[0]) return FALSE;
|
||||||
|
|
||||||
|
/* does the port exist? */
|
||||||
|
type = get_type_from_local_name(pName);
|
||||||
|
if (!type) return FALSE;
|
||||||
|
|
||||||
|
len = (lstrlenW(pName) + 1) * sizeof(WCHAR);
|
||||||
|
port = spl_alloc(sizeof(port_t) + len);
|
||||||
|
if (!port) return FALSE;
|
||||||
|
|
||||||
|
port->type = type;
|
||||||
|
memcpy(&port->nameW, pName, len);
|
||||||
|
*phPort = (HANDLE) port;
|
||||||
|
|
||||||
|
EnterCriticalSection(&port_handles_cs);
|
||||||
|
list_add_tail(&port_handles, &port->entry);
|
||||||
|
LeaveCriticalSection(&port_handles_cs);
|
||||||
|
|
||||||
|
TRACE("=> %p\n", port);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* localmon_XcvClosePort [exported through MONITOREX]
|
* localmon_XcvClosePort [exported through MONITOREX]
|
||||||
*
|
*
|
||||||
|
@ -658,13 +784,13 @@ LPMONITOREX WINAPI InitializePrintMonitor(LPWSTR regroot)
|
||||||
sizeof(MONITOREX) - sizeof(DWORD),
|
sizeof(MONITOREX) - sizeof(DWORD),
|
||||||
{
|
{
|
||||||
localmon_EnumPortsW,
|
localmon_EnumPortsW,
|
||||||
NULL, /* localmon_OpenPortW */
|
localmon_OpenPortW,
|
||||||
NULL, /* localmon_OpenPortExW */
|
NULL, /* localmon_OpenPortExW */
|
||||||
NULL, /* localmon_StartDocPortW */
|
NULL, /* localmon_StartDocPortW */
|
||||||
NULL, /* localmon_WritePortW */
|
NULL, /* localmon_WritePortW */
|
||||||
NULL, /* localmon_ReadPortW */
|
NULL, /* localmon_ReadPortW */
|
||||||
NULL, /* localmon_EndDocPortW */
|
NULL, /* localmon_EndDocPortW */
|
||||||
NULL, /* localmon_ClosePortW */
|
localmon_ClosePort,
|
||||||
NULL, /* Use AddPortUI in localui.dll */
|
NULL, /* Use AddPortUI in localui.dll */
|
||||||
localmon_AddPortExW,
|
localmon_AddPortExW,
|
||||||
NULL, /* Use ConfigurePortUI in localui.dll */
|
NULL, /* Use ConfigurePortUI in localui.dll */
|
||||||
|
|
Loading…
Reference in New Issue