/*++

Copyright (c) 1997-1999 Microsoft Corporation

Module Name:

    devinst.c

Abstract:

    device instance id test

Author:

    16-Jan-1997 AlanWar

Revision History:

--*/


#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <ole2.h>
#include <stdio.h>
#include <stdlib.h>

#include "wmium.h"
#include "wmiguid.h"

#define OffsetToPtr(Base, Offset) ((PBYTE)((PBYTE)(Base) + (Offset)))

BYTE Buffer[4096];

GUID InstanceInfoGuid = INSTANCE_INFO_GUID;

void DumpCString(PCHAR What, PWCHAR String)
{
    WCHAR Buf[MAX_PATH];
    ULONG Len;
    
    memset(Buf, 0, MAX_PATH);
    Len = *String++;
    memcpy(Buf, String, Len);
    
    printf("%s -> %ws\n", What, Buf);
}

void DumpBuffer(PWNODE_SINGLE_INSTANCE Wnode )
{
    PWCHAR String;
    
    String = (PWCHAR)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
    
    DumpCString("FriendlyName", String);
    String += (*String + sizeof(USHORT)) / sizeof(WCHAR);
    
    DumpCString("Description", String);
    String += (*String + sizeof(USHORT)) / sizeof(WCHAR);

    DumpCString("Location", String);
    String += (*String + sizeof(USHORT)) / sizeof(WCHAR);

    DumpCString("Manufacturer", String);
    String += (*String + sizeof(USHORT)) / sizeof(WCHAR);

    DumpCString("Service", String);
    String += (*String + sizeof(USHORT)) / sizeof(WCHAR);
}


void TestDevInst(
    void
    )
/*
Bad length
bad out buffer
bad input bufffer

*/
{
}


int _cdecl main(int argc, char *argv[])
{
    CHAR DevInstA[MAX_PATH];
    WMIHANDLE Handle;
    ULONG Status;
    ULONG SizeNeeded;
    ULONG BufLen;
    
    TestDevInst();
    
    if (argc == 1)
    {
        printf("devinst <device instance name>\n");
        return(0);
    }

    SizeNeeded = WmiDevInstToInstanceNameA(NULL,
                                           0,
                                           argv[1],
                                           0);
                   
    printf("SizeNeedde (%s) -> %d\n", argv[1], SizeNeeded);
    
                                       
    SizeNeeded = WmiDevInstToInstanceNameA(DevInstA,
                                           SizeNeeded,
                                           argv[1],
                                           0);
       printf("SizeNeedde (%s) -> %d\n", DevInstA, SizeNeeded);
    
    Status = WmiOpenBlock(&InstanceInfoGuid,
                          0,
                          &Handle);
    if (Status != ERROR_SUCCESS)
    {
        printf("WmiOpenBlock -> %d\n", Status);
    } else {
        BufLen = sizeof(Buffer);
        Status = WmiQuerySingleInstance(Handle,
                                        DevInstA,
                                        &BufLen,
                                        (PVOID)Buffer);
        if (Status != ERROR_SUCCESS)
        {
            printf("WmiQuerySingleInstance -> %d\n", Status);
        } else {
            DumpBuffer((PWNODE_SINGLE_INSTANCE)Buffer);
        }
        WmiCloseBlock(Handle);
    }
                                       
    
    return(ERROR_SUCCESS);
}