summaryrefslogtreecommitdiffhomepage
path: root/src/ipc/ntapi_ipc_connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipc/ntapi_ipc_connect.c')
-rw-r--r--src/ipc/ntapi_ipc_connect.c78
1 files changed, 41 insertions, 37 deletions
diff --git a/src/ipc/ntapi_ipc_connect.c b/src/ipc/ntapi_ipc_connect.c
index eacbff2..fa2abca 100644
--- a/src/ipc/ntapi_ipc_connect.c
+++ b/src/ipc/ntapi_ipc_connect.c
@@ -285,6 +285,40 @@ static int32_t __ipc_set_client_keys(
return NT_STATUS_SUCCESS;
}
+
+static int __ipc_page_alloc(void)
+{
+ int32_t status;
+ size_t size;
+ struct dalist_ex * dlist;
+ void * addr;
+ ntapi_internals * __internals;
+
+ __internals = __ntapi_internals();
+
+ addr = 0;
+ size = NT_ALLOCATION_GRANULARITY;
+ dlist = &__internals->ipc_conns;
+
+ if (__internals->ipc_page == __NT_IPC_PAGES)
+ return NT_STATUS_QUOTA_EXCEEDED;
+
+ if ((status = __ntapi->zw_allocate_virtual_memory(
+ NT_CURRENT_PROCESS_HANDLE,
+ &addr,0,&size,
+ NT_MEM_COMMIT,
+ NT_PAGE_READWRITE)))
+ return status;
+
+ __internals->ipc_pages[__internals->ipc_page++] = addr;
+
+ dalist_deposit_memory_block(
+ dlist,addr,size);
+
+ return 0;
+}
+
+
static int32_t __ipc_connect_by_attr(
void ** hport,
const nt_port_attr * attr,
@@ -351,10 +385,13 @@ static int32_t __ipc_connect_by_attr(
return __ipc_connect_return(hlock,NT_STATUS_NOT_FOUND);
/* allocate list node */
- if ((status = dalist_get_free_node(
- &__internals->ipc_conns,
- (void **)&node)))
- return __ipc_connect_return(hlock,status);
+ if (!__internals->ipc_conns.free)
+ if ((status = __ipc_page_alloc()))
+ return __ipc_connect_return(hlock,status);
+
+ dalist_get_free_node(
+ &__internals->ipc_conns,
+ (void **)&node);
/* connect as needed */
if (!hconn) {
@@ -578,39 +615,6 @@ int32_t __stdcall __ntapi_ipc_connect_by_port(
}
-int __ntapi_ipc_page_alloc(
- struct dalist_ex * dlist,
- void ** addr,
- size_t * alloc_size)
-{
- int32_t status;
- size_t size;
- ntapi_internals * __internals;
-
- __internals = __ntapi_internals();
- size = __NT_INTERNAL_PAGE_SIZE;
-
- if (__internals->ipc_page == __NT_IPC_PAGES)
- return NT_STATUS_QUOTA_EXCEEDED;
-
- if ((status = __ntapi->zw_allocate_virtual_memory(
- NT_CURRENT_PROCESS_HANDLE,
- addr,0,&size,
- NT_MEM_COMMIT,
- NT_PAGE_READWRITE)))
- return status;
-
- dalist_deposit_memory_block(
- dlist,*addr,size);
-
- __internals->ipc_pages[__internals->ipc_page++] = *addr;
-
- *alloc_size = size;
-
- return 0;
-}
-
-
int32_t __stdcall __ntapi_ipc_get_port_by_attr(
__out void ** hport,
__in nt_port_attr * attr)