[PATCH] ntdll: Add a simple test for RtlDosApplyFileIsolationRedirection_Ustr

Ivan Akulinchev ivan.akulinchev at gmail.com
Sun Nov 6 15:27:54 CST 2016


On Sunday, 6 November 2016 22:06:44 CET you wrote:
> On 06.11.2016 4:54, Ivan Akulinchev wrote:
> > Signed-off-by: Ivan Akulinchev <ivan.akulinchev at gmail.com>
> > ---
> > 
> >  dlls/ntdll/tests/Makefile.in |   1 +
> >  dlls/ntdll/tests/sxs.c       | 141
> >  +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142
> >  insertions(+)
> >  create mode 100644 dlls/ntdll/tests/sxs.c
> > 
> > diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in
> > index fc352dd..7fe1a70 100644
> > --- a/dlls/ntdll/tests/Makefile.in
> > +++ b/dlls/ntdll/tests/Makefile.in
> > @@ -21,5 +21,6 @@ C_SRCS = \
> > 
> >  	rtlbitmap.c \
> >  	rtlstr.c \
> >  	string.c \
> > 
> > +	sxs.c \
> > 
> >  	threadpool.c \
> >  	time.c
> > 
> > diff --git a/dlls/ntdll/tests/sxs.c b/dlls/ntdll/tests/sxs.c
> > new file mode 100644
> > index 0000000..e04803b
> > --- /dev/null
> > +++ b/dlls/ntdll/tests/sxs.c
> > @@ -0,0 +1,141 @@
> > +/*
> > + * Tests for the Windows side-by-side assemblies.
> > + *
> > + * Copyright 2016 Ivan Akulinchev
> > + *
> > + * This library is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU Lesser General Public
> > + * License as published by the Free Software Foundation; either
> > + * version 2.1 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
> > USA + */
> > +
> > +#include "ntstatus.h"
> > +#define WIN32_NO_STATUS
> > +#include "windef.h"
> > +#include "winbase.h"
> > +#include "winuser.h"
> > +#include "winnls.h"
> > +#include "winternl.h"
> > +
> > +#include "wine/test.h"
> > +
> > +static NTSTATUS (WINAPI
> > *pRtlDosApplyFileIsolationRedirection_Ustr)(ULONG,
> > +                                                                   
> > PUNICODE_STRING, +                                                       
> >             PUNICODE_STRING, +                                           
> >                         PUNICODE_STRING, +                               
> >                                     PUNICODE_STRING, +                   
> >                                                 PUNICODE_STRING *, +     
> >                                                               PULONG, +  
> >                                                                  PULONG,
> > +                                                                   
> > PULONG); +
> > +static const CHAR manifest_name[] = "winsxs.manifest";
> > +
> > +/* Note: '\n' is intentionally skipped. */
> > +static const CHAR manifest[] =
> > +    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
> > +    "<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\"
> > manifestVersion=\"1.0\">" +    "  <assemblyIdentity type=\"win32\""
> > +    "                    name=\"Wine.NtDll.Tests\""
> > +    "                    version=\"1.0.0.0\""
> > +    "                    processorArchitecture=\"*\" />"
> > +    "  <dependency>"
> > +    "    <dependentAssembly>"
> > +    "      <assemblyIdentity type=\"win32\""
> > +    "                        name=\"microsoft.windows.common-controls\""
> > +    "                        version=\"6.0.0.0\""
> > +    "                        processorArchitecture=\"*\""
> > +    "                        publicKeyToken=\"6595b64144ccf1df\""
> > +    "                        language=\"*\" />"
> > +    "    </dependentAssembly>"
> > +    "  </dependency>"
> > +    "</assembly>";
> > +
> > +static void test_rtl_dos_apply_file_isolation_redirect(void)
> > +{
> > +    NTSTATUS status;
> > +    WCHAR buffer[MAX_PATH];
> > +    UNICODE_STRING original_name;
> > +    UNICODE_STRING extension;
> > +    UNICODE_STRING unknown1;
> > +    UNICODE_STRING unknown2;
> > +    UNICODE_STRING *path;
> > +
> > +    static const WCHAR original_nameW[] =
> > {'c','o','m','c','t','l','3','2',0}; +    static const WCHAR extensionW[]
> > = {'.','d','l','l',0};
> > +    static const WCHAR emptyW[] = {'\0',0};
> > +
> > +    RtlInitUnicodeString(&original_name, original_nameW);
> > +    RtlInitUnicodeString(&extension, extensionW);
> > +    RtlInitUnicodeString(&unknown2, emptyW);
> > +
> > +    unknown1.Buffer = buffer;
> > +    unknown1.Length = 0;
> > +    unknown1.MaximumLength = MAX_PATH;
> > +
> > +    status = pRtlDosApplyFileIsolationRedirection_Ustr(1, &original_name,
> > &extension, &unknown1, +                                                 
> >      &unknown2, &path, NULL, NULL, NULL);
> Where does this prototype come from

I found this prototype on the Internet (just look for the name), and it is 
likely to be wrong.

> and why do we need this function in a first place?

We needn't it in a first place, but we (probably) need to test every exported 
function, because if an application can import something (especially by name, 
not an ordinal number), this application can rely on it. For example, this 
function is required by some old viruses from the past decade (a computer 
museum of the future may want to use Wine for demonstration purposes).

Also it is a very important function used by Windows to support "Side-by-Side 
Assemblies", such as version 6 of comctl32. I can write a private mail with 
details to everybody, who wants to know how does it work, and who is NOT going 
to implement this function in Wine (to keep it clean from Microsoft's "trade 
secrets" and so on).



More information about the wine-devel mailing list