diff options
Diffstat (limited to 'src/ipc/ntapi_ipc_connect.c')
-rw-r--r-- | src/ipc/ntapi_ipc_connect.c | 78 |
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) |