LWMsgStatus lwmsg_assoc_destroy_message( LWMsgAssoc* assoc, LWMsgMessage* message ) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; LWMsgTypeSpec* type = NULL; LWMsgDataContext* context = NULL; if (message->tag != -1) { BAIL_ON_ERROR(status = lwmsg_protocol_get_message_type(assoc->prot, message->tag, &type)); if (type != NULL) { BAIL_ON_ERROR(status = lwmsg_data_context_new(&assoc->context, &context)); BAIL_ON_ERROR(status = lwmsg_data_free_graph(context, type, message->data)); } message->tag = -1; message->data = NULL; } error: if (context) { lwmsg_data_context_delete(context); } return status; }
LW_NTSTATUS LwFileInfoFreeGetInfoInParameters( PFILE_INFO_GET_INFO_IN_PARAMS pParams ) { NTSTATUS ntStatus = 0; LWMsgDataContext* pDataContext = NULL; ntStatus = LwSrvInfoAcquireDataContext(&pDataContext); BAIL_ON_NT_STATUS(ntStatus); if (pParams) { lwmsg_data_free_graph(pDataContext, gFileInfoGetInParamsSpec, pParams); } cleanup: LwSrvInfoReleaseDataContext(pDataContext); return ntStatus; error: goto cleanup; }
LW_NTSTATUS LwFileInfoFreeEnumInputParameters( PFILE_INFO_ENUM_IN_PARAMS pParams ) { NTSTATUS Status = STATUS_SUCCESS; LWMsgDataContext* pDataContext = NULL; Status = LwSrvInfoAcquireDataContext(&pDataContext); BAIL_ON_NT_STATUS(Status); lwmsg_data_free_graph( pDataContext, gFileInfoEnumInParamsSpec, pParams); cleanup: LwSrvInfoReleaseDataContext(pDataContext); return Status; error: goto cleanup; }
static VOID LwFileInfoFreeEnumOutPreambleInternal( LWMsgDataContext* pDataContext, PFILE_INFO_ENUM_OUT_PREAMBLE pPreamble ) { lwmsg_data_free_graph( pDataContext, gFileInfoEnumOutParamsPreambleSpec, pPreamble); }
LW_NTSTATUS LwFileInfoUnmarshalCloseParameters( PBYTE pBuffer, ULONG ulBufferSize, PFILE_INFO_CLOSE_PARAMS* ppParams ) { NTSTATUS Status = STATUS_SUCCESS; PFILE_INFO_CLOSE_PARAMS pParams = NULL; LWMsgDataContext* pDataContext = NULL; Status = LwSrvInfoAcquireDataContext(&pDataContext); BAIL_ON_NT_STATUS(Status); Status = MAP_LWMSG_STATUS( lwmsg_data_unmarshal_flat( pDataContext, gFileInfoCloseParamsSpec, pBuffer, ulBufferSize, OUT_PPVOID(&pParams))); BAIL_ON_NT_STATUS(Status); *ppParams = pParams; cleanup: LwSrvInfoReleaseDataContext(pDataContext); return Status; error: *ppParams = NULL; if (pParams) { lwmsg_data_free_graph(pDataContext, gFileInfoCloseParamsSpec, pParams); } goto cleanup; }
MU_TEST(marshal, basic) { static const unsigned char expected[] = { /* -42 */ 0xFF, 0xD6, /* 2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, /* 1234 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD2, /* 4321 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xE1 }; LWMsgTypeSpec* type = basic_spec; void* buffer; size_t length; basic_struct basic; basic_struct *out; long longs[2]; basic.foo = (short) -42; basic.len = 2; basic.long_ptr = longs; longs[0] = 1234; longs[1] = 4321; MU_TRY_DCONTEXT(dcontext, lwmsg_data_marshal_flat_alloc(dcontext, type, &basic, &buffer, &length)); MU_ASSERT_EQUAL(MU_TYPE_INTEGER, sizeof(expected), length); MU_ASSERT(!memcmp(buffer, expected, sizeof(expected))); MU_TRY_DCONTEXT(dcontext, lwmsg_data_unmarshal_flat(dcontext, type, buffer, length, (void**) (void*) &out)); MU_ASSERT(basic.foo == out->foo); MU_ASSERT(basic.len == out->len); MU_ASSERT(basic.long_ptr[0] == out->long_ptr[0]); MU_ASSERT(basic.long_ptr[1] == out->long_ptr[1]); MU_TRY_DCONTEXT(dcontext, lwmsg_data_free_graph(dcontext, type, out)); lwmsg_context_free(context, buffer); }
LWMsgStatus lwmsg_assoc_free_graph( LWMsgAssoc* assoc, LWMsgTag mtype, void* object ) { LWMsgStatus status = LWMSG_STATUS_SUCCESS; LWMsgTypeSpec* type = NULL; LWMsgDataContext* context = NULL; BAIL_ON_ERROR(status = lwmsg_protocol_get_message_type(assoc->prot, mtype, &type)); BAIL_ON_ERROR(status = lwmsg_data_context_new(&assoc->context, &context)); BAIL_ON_ERROR(status = lwmsg_data_free_graph(context, type, object)); error: if (context) { lwmsg_data_context_delete(context); } return status; }
LSASS_API DWORD LsaAdEnumGroupsFromCache( IN HANDLE hLsaConnection, IN OPTIONAL PCSTR pszDomainName, IN PSTR* ppszResume, IN DWORD dwMaxNumGroups, OUT PDWORD pdwGroupsFound, OUT PLSA_SECURITY_OBJECT** pppObjects ) { DWORD dwError = 0; PSTR pszTargetProvider = NULL; DWORD dwOutputBufferSize = 0; PVOID pOutputBuffer = NULL; PVOID pBlob = NULL; size_t BlobSize = 0; LWMsgContext* context = NULL; LWMsgDataContext* pDataContext = NULL; LSA_AD_IPC_ENUM_GROUPS_FROM_CACHE_REQ request; PLSA_AD_IPC_ENUM_GROUPS_FROM_CACHE_RESP response = NULL; memset(&request, 0, sizeof(request)); if (geteuid() != 0) { dwError = LW_ERROR_ACCESS_DENIED; BAIL_ON_LSA_ERROR(dwError); } if (pszDomainName) { dwError = LwAllocateStringPrintf( &pszTargetProvider, "%s:%s", LSA_PROVIDER_TAG_AD, pszDomainName); BAIL_ON_LSA_ERROR(dwError); } // marshal the request request.pszResume = *ppszResume; request.dwMaxNumGroups = dwMaxNumGroups; dwError = MAP_LWMSG_ERROR(lwmsg_context_new(NULL, &context)); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_context_new(context, &pDataContext)); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_marshal_flat_alloc( pDataContext, LsaAdIPCGetEnumGroupsFromCacheReqSpec(), &request, &pBlob, &BlobSize)); BAIL_ON_LSA_ERROR(dwError); dwError = LsaProviderIoControl( hLsaConnection, pszTargetProvider ? pszTargetProvider : LSA_PROVIDER_TAG_AD, LSA_AD_IO_ENUMGROUPSCACHE, BlobSize, pBlob, &dwOutputBufferSize, &pOutputBuffer); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_unmarshal_flat( pDataContext, LsaAdIPCGetEnumGroupsFromCacheRespSpec(), pOutputBuffer, dwOutputBufferSize, (PVOID*)&response)); BAIL_ON_LSA_ERROR(dwError); *pdwGroupsFound = response->dwNumGroups; *pppObjects = response->ppObjects; response->ppObjects = NULL; if ( *ppszResume ) { LwFreeMemory(*ppszResume); *ppszResume = NULL; } *ppszResume = response->pszResume; response->pszResume = NULL; cleanup: if ( response ) { lwmsg_data_free_graph( pDataContext, LsaAdIPCGetEnumGroupsFromCacheRespSpec(), response); } if (pDataContext) { lwmsg_data_context_delete(pDataContext); } if ( context ) { lwmsg_context_delete(context); } if ( pBlob ) { LwFreeMemory(pBlob); } if ( pOutputBuffer ) { LwFreeMemory(pOutputBuffer); } LW_SAFE_FREE_STRING(pszTargetProvider); return dwError; error: if ( *ppszResume ) { LwFreeMemory(*ppszResume); *ppszResume = NULL; } *pdwGroupsFound = 0; *pppObjects = NULL; goto cleanup; }