From 84096382fc4ca80f5fc59908bf287e28a291bae8 Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju Date: Tue, 5 May 2020 13:51:36 +0200 Subject: [PATCH] msasn1: Implement ASN1_CreateModule function. Based on patch from Austin English. Wine-Bug: https:/bugs.winehq.org/show_bug.cgi?id=38020 Signed-off-by: Vijay Kiran Kamuju Signed-off-by: Alexandre Julliard --- dlls/msasn1/main.c | 30 +++++++++++++++++++++++++++++- dlls/msasn1/tests/asn1.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/dlls/msasn1/main.c b/dlls/msasn1/main.c index 90c4a8a9c9d..6882fbf6c9b 100644 --- a/dlls/msasn1/main.c +++ b/dlls/msasn1/main.c @@ -23,6 +23,7 @@ #include "winbase.h" #include "msasn1.h" +#include "wine/heap.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(msasn1); @@ -49,10 +50,37 @@ ASN1module_t WINAPI ASN1_CreateModule(ASN1uint32_t ver, ASN1encodingrule_e rule, { ASN1module_t module = NULL; - FIXME("(%08x %08x %08x %u %p %p %p %p %u): Stub!\n", ver, rule, flags, pdu, encoder, decoder, freemem, size, magic); + TRACE("(%08x %08x %08x %u %p %p %p %p %u)\n", ver, rule, flags, pdu, encoder, decoder, freemem, size, magic); if (!encoder || !decoder || !freemem || !size) return module; + module = heap_alloc(sizeof(module)); + if (module) + { + module->nModuleName = magic; + module->eRule = rule; + module->dwFlags = flags; + module->cPDUs = pdu; + module->apfnFreeMemory = freemem; + module->acbStructSize = size; + + if (rule & ASN1_PER_RULE) + { + module->PER.apfnEncoder = (ASN1PerEncFun_t *)encoder; + module->PER.apfnDecoder = (ASN1PerDecFun_t *)decoder; + } + else if (rule & ASN1_BER_RULE) + { + module->BER.apfnEncoder = (ASN1BerEncFun_t *)encoder; + module->BER.apfnDecoder = (ASN1BerDecFun_t *)decoder; + } + else + { + module->PER.apfnEncoder = NULL; + module->PER.apfnDecoder = NULL; + } + } + return module; } diff --git a/dlls/msasn1/tests/asn1.c b/dlls/msasn1/tests/asn1.c index 19019fc72b0..adbf547efaf 100644 --- a/dlls/msasn1/tests/asn1.c +++ b/dlls/msasn1/tests/asn1.c @@ -46,10 +46,39 @@ static void test_CreateModule(void) ok(!mod, "Expected Failure.\n"); mod = ASN1_CreateModule(0, 0, 0, 0, encfn, decfn, freefn, size, 0); - todo_wine ok(!!mod, "Failed to create module.\n"); + ok(!!mod, "Failed to create module.\n"); + ok(mod->nModuleName==0, "Got Module name = %d\n.",mod->nModuleName); + ok(mod->eRule==0, "Got eRule = %08x\n.",mod->eRule); + ok(mod->dwFlags==0, "Got Flags = %08x\n.",mod->dwFlags); + ok(mod->cPDUs==0, "Got PDUs = %08x\n.",mod->cPDUs); + ok(mod->apfnFreeMemory==freefn, "Free function = %p.\n",mod->apfnFreeMemory); + ok(mod->acbStructSize==size, "Struct size = %p.\n",mod->acbStructSize); + ok(!mod->PER.apfnEncoder, "Encoder function should not be s et.\n"); + ok(!mod->PER.apfnDecoder, "Decoder function should not be set.\n"); mod = ASN1_CreateModule(ASN1_THIS_VERSION, ASN1_BER_RULE_DER, ASN1FLAGS_NOASSERT, 1, encfn, decfn, freefn, size, name); - todo_wine ok(!!mod, "Failed to create module.\n"); + ok(!!mod, "Failed to create module.\n"); + ok(mod->nModuleName==name, "Got Module name = %d\n.",mod->nModuleName); + ok(mod->eRule==ASN1_BER_RULE_DER, "Got eRule = %08x\n.",mod->eRule); + ok(mod->cPDUs==1, "Got PDUs = %08x\n.",mod->cPDUs); + ok(mod->dwFlags==ASN1FLAGS_NOASSERT, "Got Flags = %08x\n.",mod->dwFlags); + ok(mod->apfnFreeMemory==freefn, "Free function = %p.\n",mod->apfnFreeMemory); + ok(mod->acbStructSize==size, "Struct size = %p.\n",mod->acbStructSize); + ok(mod->BER.apfnEncoder==(ASN1BerEncFun_t *)encfn, "Encoder function = %p.\n",mod->BER.apfnEncoder); + ok(mod->BER.apfnDecoder==(ASN1BerDecFun_t *)decfn, "Decoder function = %p.\n",mod->BER.apfnDecoder); + + mod = ASN1_CreateModule(ASN1_THIS_VERSION, ASN1_PER_RULE_ALIGNED, ASN1FLAGS_NOASSERT, 1, encfn, decfn, freefn, size, name); + ok(!!mod, "Failed to create module.\n"); + ok(mod->nModuleName==name, "Got Module name = %d\n.",mod->nModuleName); + ok(mod->eRule==ASN1_PER_RULE_ALIGNED, "Got eRule = %08x\n.",mod->eRule); + ok(mod->cPDUs==1, "Got PDUs = %08x\n.",mod->cPDUs); + ok(mod->dwFlags==ASN1FLAGS_NOASSERT, "Got Flags = %08x\n.",mod->dwFlags); + ok(mod->apfnFreeMemory==freefn, "Free function = %p.\n",mod->apfnFreeMemory); + ok(mod->acbStructSize==size, "Struct size = %p.\n",mod->acbStructSize); + ok(mod->PER.apfnEncoder==(ASN1PerEncFun_t *)encfn /* WINXP & WIN2008 */ || + broken(!mod->PER.apfnEncoder), "Encoder function = %p.\n",mod->PER.apfnEncoder); + ok(mod->PER.apfnDecoder==(ASN1PerDecFun_t *)decfn /* WINXP & WIN2008 */ || + broken(!mod->PER.apfnDecoder), "Decoder function = %p.\n",mod->PER.apfnDecoder); } START_TEST(asn1)