silverf0x / RpcView

RpcView is a free tool to explore and decompile Microsoft RPC interfaces
GNU General Public License v3.0
901 stars 246 forks source link

Fix size_is description when the parameter is out #9

Closed 1orenz0 closed 6 years ago

1orenz0 commented 6 years ago

Mamène, je suis tombé sur un bug plus mineur que la majorité de mon public.

L'autre jour en décompilant une interface, RpcView m'a retourné ce genre d'idl :

[
    uuid(aaaaaa-bbbb-cccc-dddd-eeeeeeeeee),
    version(1.0),
]
interface ToiAussiTuLeC
{
    long Proc0(
        [in] long arg1,
        [out] long *ResponseCount,
        [out] [ref] [size_is(*ResponseCount)] structXX_t** ResponseArray
    );
}

Jusque là pas de lézards, le veursé me renvoi un nombre d'éléments et un tableau de données associées. Sauf que midl.exe il kiffe franchement pas :

midl.exe /client stub  .\ToiAussiTuLeC.idl
Microsoft (R) 32b/64b MIDL Compiler Version 8.01.0622
Copyright (c) Microsoft Corporation. All rights reserved.
64 bit Processing .\ToiAussiTuLeC.idl
ToiAussiTuLeC.idl
.\ToiAussiTuLeC.idl(75) : error MIDL2123 : expression used for a size attribute must not derive from an [out] only parameter : [ Parameter 'ResponseArray' of Procedure 'Proc0' ( Interface 'ToiAussiTuLeC' ) ]

Le souci, c'est ke tu peu pas décrire la taille de ton tableau de sortie à partir d'un argument qui est également un paramètre de sortie. Au mieux, tu peux lui donner une taille max :

[
    uuid(aaaaaa-bbbb-cccc-dddd-eeeeeeeeee),
    version(1.0),
]
interface ToiAussiTuLeC
{
    long Proc0(
        [in] long arg1,
        [out] long *ResponseCount,
        [out] [ref] [size_is(, *ResponseCount)] structXX_t** ResponseArray
    );
}

C'est ce qu'ils font dans les examples de la MSDN : https://msdn.microsoft.com/en-us/library/windows/desktop/aa367164(v=vs.85).aspx