/*++

Copyright (c) 1995-2000  Microsoft Corporation

Module Name:

    PNP.IDL

Abstract:

    Contains the PnP APIs which are used to remote the plug-and-play
    APIs to the local or remote server via RPC. Also contains the RPC
    specific data structures for these API.

    ** NOTE: You _must_ add new interfaces to the end of the file.  **
    ** Inserting them in the middle breaks backwards compatibility. **
    
Author:

    Paula Tomlinson   (paulat)   06-June-1995

Environment:

    User-mode - Win32 - MIDL

Revision History:

    06-June-1995     PaulaT
        created

--*/

//
// Interface Attributes
//

[
    uuid(8D9F4E40-A03D-11CE-8F69-08003E30051B),
    version(1.0),
#ifdef __midl
        ms_union,
#endif // __midl
    pointer_default(unique)
]

//
// Interface Keyword
//

interface pnp

//
// Interface Body
//

{

import "imports.idl"; // import all the include files

//
// PnP Generic Handle used to bind from client to server.
//

typedef [handle,unique] LPWSTR PNP_HANDLE;
typedef [context_handle] void* PNP_NOTIFICATION_CONTEXT;
typedef PNP_NOTIFICATION_CONTEXT *PPNP_NOTIFICATION_CONTEXT;

typedef struct _PNP_CLIENT_CONTEXT {
        ULONG   PNP_CC_Signature;
        ULONG_PTR PNP_CC_ContextHandle;
} PNP_CLIENT_CONTEXT, *PPNP_CLIENT_CONTEXT;


//
// Function Prototypes (UNICODE only, PNP is unicode internally)
//
//
// NOTE:
//    The names of the functions are short so that when RPC
//    prepends the interface name to the names, they are still
//    unique.
//
//
// NOTE: Whenever [out,string] is used for an attribute, that means the
//       client and server are assuming valid (predefined) sizes of buffers
//       in order to more efficiently copy the data between address spaces
//       (this is generally only used for internal buffers, not user buffers)


// these two routines are place holders --------------
CONFIGRET
PNP_Connect(
   [in,string,unique]        PNP_HANDLE UNCServerName
   );


CONFIGRET
PNP_Disconnect(
   [in,string,unique]        PNP_HANDLE UNCServerName
   );
// these two routines are place holders -------------

CONFIGRET
PNP_GetVersion(
   [in]                      handle_t   hBinding,
   [out]                     WORD      *pVersion
   );

CONFIGRET
PNP_GetGlobalState(
   [in]                      handle_t   hBinding,
   [out]                     PULONG     pulState,
   [in]                      ULONG      ulFlags
   );


CONFIGRET
PNP_InitDetection(
   [in]                      handle_t   hBinding
   );

CONFIGRET
PNP_ReportLogOn(
   [in]                      handle_t   hBinding,
   [in]                      BOOL       bAdmin,
   [in]                      DWORD      ProcessID
   );

CONFIGRET
PNP_ValidateDeviceInstance(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPWSTR     pDeviceID,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetRootDeviceInstance(
   [in]                      handle_t   hBinding,
   [out,string,size_is(ulLength)] LPWSTR  pDeviceID,
   [in]                      ULONG      ulLength
   );

CONFIGRET
PNP_GetRelatedDeviceInstance(
   [in]                      handle_t   hBinding,
   [in]                      ULONG      ulRelationship,
   [in,string,ref]           LPWSTR     pDeviceID,
   [out,string,size_is(*pulLength)] LPWSTR pRelatedDeviceID,
   [in,out]                  PULONG     pulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_EnumerateSubKeys(
   [in]                      handle_t   hBinding,
   [in]                      ULONG      ulBranch,
   [in]                      ULONG      ulIndex,
   [out,string,size_is(ulLength)] PWSTR Buffer,
   [in]                      ULONG      ulLength,
   [out]                     PULONG     pulRequiredLen,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetDeviceList(
   [in]                     handle_t   hBinding,
   [in,string,unique]       LPCWSTR    pszFilter,
   [out,size_is(*pulLength),length_is(*pulLength)]  LPWSTR Buffer,
   [in,out]                 PULONG     pulLength,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetDeviceListSize(
   [in]                     handle_t   hBinding,
   [in,string,unique]       LPCWSTR    pszFilter,
   [out]                    PULONG     pulLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetDepth(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPCWSTR    pszDeviceID,
   [out]                    PULONG     pulDepth,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetDeviceRegProp(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pDeviceID,
   [in]                      ULONG      ulProperty,
   [in,out]                  PULONG     pulRegDataType,
   [out,size_is(*pulTransferLen),length_is(*pulTransferLen)] LPBYTE Buffer,
   [in,out]                  PULONG     pulTransferLen,
   [in,out]                  PULONG     pulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_SetDeviceRegProp(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pDeviceID,
   [in]                      ULONG      ulProperty,
   [in]                      ULONG      ulDataType,
   [in,size_is(ulLength)]    LPBYTE     Buffer,
   [in]                      ULONG      ulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetClassInstance(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pDeviceID,
   [out,string,size_is(ulLength)] LPWSTR pszClassInstance,
   [in]                      ULONG      ulLength
   );

CONFIGRET
PNP_CreateKey(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pszSubKey,
   [in]                      REGSAM     samDesired,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_DeleteRegistryKey(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pszDeviceID,
   [in,string,ref]           LPCWSTR    pszParentKey,
   [in,string,ref]           LPCWSTR    pszChildKey,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetClassCount(
   [in]                      handle_t   hBinding,
   [out]                     PULONG     pulClassCount,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetClassName(
   [in]                     handle_t   hBinding,
   [in,string,ref]          PCWSTR     pszClassGuid,
   [out,string,size_is(*pulLength)] PWSTR Buffer,
   [in,out]                 PULONG     pulLength,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_DeleteClassKey(
   [in]                     handle_t   hBinding,
   [in,string,ref]          PCWSTR     pszClassGuid,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetInterfaceDeviceAlias(
   [in]                     handle_t   hBinding,
   [in,string,ref]          PCWSTR     pszInterfaceDevice,
   [in]                                         LPGUID   AliasInterfaceGuid,
   [out,string,size_is(*pulTransferLen)] PWSTR pszAliasInterfaceDevice,
   [in,out]                 PULONG     pulLength,
   [in,out]                 PULONG     pulTransferLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetInterfaceDeviceList(
   [in]                     handle_t   hBinding,
   [in]                                         LPGUID   InterfaceGuid,
   [in,string,unique]       LPCWSTR    pszDeviceID,
   [out,size_is(*pulLength),length_is(*pulLength)]  LPWSTR Buffer,
   [in,out]                 PULONG     pulLength,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetInterfaceDeviceListSize(
   [in]                     handle_t   hBinding,
   [out]                    PULONG     pulLen,
   [in]                                         LPGUID   InterfaceGuid,
   [in,string,unique]       LPCWSTR    pszDeviceID,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_RegisterDeviceClassAssociation(
   [in]                     handle_t   hBinding,
   [in,string,unique]       LPCWSTR    pszDeviceID,
   [in]                                         LPGUID   InterfaceGuid,
   [in,string,unique]       LPCWSTR    pszReference,
   [out,string,size_is(*pulTransferLen)] PWSTR pszSymLink,
   [in,out]                 PULONG     pulLength,
   [in,out]                 PULONG     pulTransferLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_UnregisterDeviceClassAssociation(
   [in]                     handle_t   hBinding,
   [in,string,unique]       LPCWSTR    pszInterfaceDevice,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetClassRegProp(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pszClassGuid,
   [in]                      ULONG      ulProperty,
   [in,out]                  PULONG     pulRegDataType,
   [out,size_is(*pulTransferLen),length_is(*pulTransferLen)] LPBYTE Buffer,
   [in,out]                  PULONG     pulTransferLen,
   [in,out]                  PULONG     pulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_SetClassRegProp(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pszClassGuid,
   [in]                      ULONG      ulProperty,
   [in]                      ULONG      ulDataType,
   [in,size_is(ulLength)]    LPBYTE     Buffer,
   [in]                      ULONG      ulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_CreateDevInst(
   [in]                     handle_t            hBinding,
   [in,out,string,size_is(ulLength)] LPWSTR pszDeviceID,
   [in,string,ref]          LPWSTR              pszParentDeviceID,
   [in]                     ULONG               ulLength,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_DeviceInstanceAction(
   [in]                     handle_t            hBinding,
   [in]                     ULONG               ulMajorAction,
   [in]                     ULONG               ulMinorAction,
   [in,string,unique]       PCWSTR              pszDeviceInstance1,
   [in,string,unique]       PCWSTR              pszDeviceInstance2
   );

CONFIGRET
PNP_GetDeviceStatus(
   [in]                     handle_t            hBinding,
   [in,string,unique]       LPCWSTR             pDeviceID,
   [out]                    PULONG              pulStatus,
   [out]                    PULONG              pulProblem,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_SetDeviceProblem(
   [in]                     handle_t            hBinding,
   [in,string,unique]       LPCWSTR             pDeviceID,
   [in]                     ULONG               ulProblem,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_DisableDevInst(
   [in]                     handle_t            hBinding,
   [in,string,unique]       LPCWSTR             pDeviceID,
   [in,out,unique]                      PPNP_VETO_TYPE  pVetoType,
   [in,out,string,max_is(ulNameLength),unique]  LPWSTR pszVetoName,
   [in]                                         ULONG                   ulNameLength,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_UninstallDevInst(
   [in]                     handle_t            hBinding,
   [in,string,unique]       LPCWSTR             pDeviceID,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_AddID(
   [in]                     handle_t            hBinding,
   [in,string,unique]       LPCWSTR             pszDeviceID,
   [in,string,ref]          LPCWSTR             pszID,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_RegisterDriver(
   [in]                     handle_t            hBinding,
   [in,string,ref]          LPCWSTR             pszDeviceID,
   [in]                     ULONG               ulFlags
   );


CONFIGRET
PNP_QueryRemove(
   [in]                     handle_t            hBinding,
   [in,string,ref]          LPCWSTR             pszDeviceID,
   [in,out,unique]                      PPNP_VETO_TYPE  pVetoType,
   [in,out,string,max_is(ulNameLength),unique]  LPWSTR pszVetoName,
   [in]                                         ULONG                   ulNameLength,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_RequestDeviceEject(
   [in]                     handle_t            hBinding,
   [in,string,ref]          LPCWSTR             pszDeviceID,
   [in,out,unique]          PPNP_VETO_TYPE      pVetoType,
   [in,out,string,max_is(ulNameLength),unique]  LPWSTR pszVetoName,
   [in]                                         ULONG                   ulNameLength,
   [in]                     ULONG               ulFlags
   );

CONFIGRET
PNP_IsDockStationPresent (
    [in]                    handle_t   hBinding,
    [in,out,unique]         PBOOL      Present
    );

CONFIGRET
PNP_RequestEjectPC (
    [in]                    handle_t   hBinding
    );

CONFIGRET
PNP_HwProfFlags(
   [in]                     handle_t   hBinding,
   [in]                     ULONG      ulAction,
   [in,string,ref]          LPCWSTR    pDeviceID,
   [in]                     ULONG      ulConfig,
   [in,out]                 PULONG     pulValue,
   [in,out,unique]                      PPNP_VETO_TYPE  pVetoType,
   [in,out,string,max_is(ulNameLength),unique]  LPWSTR pszVetoName,
   [in]                                         ULONG                   ulNameLength,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetHwProfInfo(
   [in]                     handle_t   hBinding,
   [in]                     ULONG      ulIndex,
   [in,out,ref]             HWPROFILEINFO *pHWProfileInfo,
   [in]                     ULONG      ulProfileInfoSize,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_AddEmptyLogConf(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulPriority,
   [out]                    PULONG     pulLogConfTag,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_FreeLogConf(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfType,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetFirstLogConf(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfType,
   [out]                    PULONG     pulLogConfTag,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetNextLogConf(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfType,
   [in]                     ULONG      ulCurrentTag,
   [out]                    PULONG     pulNextTag,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetLogConfPriority(
   [in]                     handle_t    hBinding,
   [in,string,ref]          LPWSTR      pDeviceID,
   [in]                     ULONG       ulType,
   [in]                     ULONG       ulTag,
   [out]                    PULONG      pPriority,
   [in]                     ULONG       ulFlags
   );

CONFIGRET
PNP_AddResDes(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID ResourceID,
   [out]                    PULONG     pulResourceTag,
   [in,size_is(ResourceLen)] LPBYTE    ResourceData,
   [in]                     ULONG      ResourceLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_FreeResDes(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID ResourceID,
   [in]                     ULONG      ulResourceTag,
   [out]                    PULONG     pulPreviousResType,
   [out]                    PULONG     pulPreviousResTag,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetNextResDes(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID ResourceID,
   [in]                     ULONG      ulResourceTag,
   [out]                    PULONG     pulNextResDesTag,
   [out]                    PULONG     pulNextResDesType,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetResDesData(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID ResourceID,
   [in]                     ULONG      ulResourceTag,
   [out,size_is(BufferLen)] LPBYTE     Buffer,
   [in]                     ULONG      BufferLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_GetResDesDataSize(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID ResourceID,
   [in]                     ULONG      ulResourceTag,
   [out]                    PULONG     pulSize,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_ModifyResDes(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     ULONG      ulLogConfTag,
   [in]                     ULONG      ulLogConfType,
   [in]                     RESOURCEID CurrentResourceID,
   [in]                     RESOURCEID NewResourceID,
   [in]                     ULONG      ulResourceTag,
   [in,size_is(ResourceLen)] LPBYTE    ResourceData,
   [in]                     ULONG      ResourceLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_DetectResourceConflict(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     RESOURCEID ResourceID,
   [in,size_is(ResourceLen)] LPBYTE    ResourceData,
   [in]                     ULONG      ResourceLen,
   [out]                    PBOOL      pbConflictDetected,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_QueryResConfList(
   [in]                     handle_t   hBinding,
   [in,string,ref]          LPWSTR     pDeviceID,
   [in]                     RESOURCEID ResourceID,
   [in,size_is(ResourceLen)] LPBYTE    ResourceData,
   [in]                     ULONG      ResourceLen,
   [out,size_is(BufferLen)] LPBYTE     Buffer,
   [in]                     ULONG      BufferLen,
   [in]                     ULONG      ulFlags
   );

CONFIGRET
PNP_SetHwProf(
    [in]                     handle_t   hBinding,
    [in]                     ULONG      ulHardwareProfile,
    [in]                     ULONG      ulFlags
    );

CONFIGRET
PNP_QueryArbitratorFreeData(
    [in]                     handle_t   hBinding,
    [out,size_is(ulDataLen)] LPBYTE     pData,
    [in]                     ULONG      ulDataLen,
    [in,string,ref]          LPCWSTR    pszDeviceID,
    [in]                     RESOURCEID ResourceID,
    [in]                     ULONG      ulFlags
    );

CONFIGRET
PNP_QueryArbitratorFreeSize(
    [in]                     handle_t   hBinding,
    [out]                    PULONG     pulSize,
    [in,string,ref]          LPCWSTR    pszDeviceID,
    [in]                     RESOURCEID ResourceID,
    [in]                     ULONG      ulFlags
    );

CONFIGRET
PNP_RunDetection(
    [in]                     handle_t   hBinding,
    [in]                     ULONG      ulFlags
    );

CONFIGRET
PNP_RegisterNotification(
    [in]                     handle_t hBinding,
    [in]                     ULONG_PTR hRecipient,
    [in,string,ref]          LPWSTR   ServiceName,
    [in,size_is(ulSize)]     LPBYTE   NotificationFilter,
    [in]                     ULONG    ulSize,
    [in]                     DWORD    Flags,
    [out]                    PNP_NOTIFICATION_CONTEXT *Context,
    [in]                     ULONG    hProcess,
    [in]                     ULONG64  *ClientContext
    );

CONFIGRET
PNP_UnregisterNotification(
    [in]                     handle_t hBinding,
    [in,out]                 PNP_NOTIFICATION_CONTEXT *Context
    );

CONFIGRET
PNP_GetCustomDevProp(
   [in]                      handle_t   hBinding,
   [in,string,ref]           LPCWSTR    pDeviceID,
   [in,string,ref]           LPCWSTR    CustomPropName,
   [out]                     PULONG     pulRegDataType,
   [out,size_is(*pulLength),length_is(*pulTransferLen)] LPBYTE Buffer,
   [out]                     PULONG     pulTransferLen,
   [in,out]                  PULONG     pulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetVersionInternal(
   [in]                      handle_t   hBinding,
   [in,out]                  WORD      *pwVersion
   );

CONFIGRET
PNP_GetBlockedDriverInfo(
   [in]                      handle_t   hBinding,
   [out,size_is(*pulLength),length_is(*pulTransferLen)] LPBYTE Buffer,
   [out]                     PULONG     pulTransferLen,
   [in,out]                  PULONG     pulLength,
   [in]                      ULONG      ulFlags
   );

CONFIGRET
PNP_GetServerSideDeviceInstallFlags(
   [in]                      handle_t   hBinding,
   [out]                     PULONG     pulSSDIFlags,
   [in]                      ULONG      ulFlags
   );

//---------------------------------------------------------
// ** ADD NEW INTERFACES HERE **
//---------------------------------------------------------

}


