windows-nt/Source/XPSP1/NT/enduser/netmeeting/h/isdmapi2.h
2020-09-26 16:20:57 +08:00

366 lines
14 KiB
C

#ifndef __ISDMAPI2_H__
#define __ISDMAPI2_H__
/****************************************************************************
*
* $Archive: S:/STURGEON/SRC/INCLUDE/VCS/isdmapi2.h_v $
*
* INTEL Corporation Prorietary Information
*
* This listing is supplied under the terms of a license agreement
* with INTEL Corporation and may not be copied nor disclosed except
* in accordance with the terms of that agreement.
*
* Copyright (c) 1993-1994 Intel Corporation.
*
* $Revision: 1.10 $
* $Date: 08 Oct 1996 17:29:42 $
* $Author: MANDREWS $
*
* Deliverable:
*
* Abstract:
*
* Notes:
*
***************************************************************************/
#ifdef __cplusplus
extern "C" { // Assume C declarations for C++.
#endif // __cplusplus
#ifndef DllExport
#define DllExport __declspec( dllexport )
#endif // DllExport
//reserved key define for backwards compatability with old API
//all ISDM1 data falls under this key
#define BACKCOMP_KEY "BackCompatability"
//value type defines
#define DWORD_VALUE 2
#define STRING_VALUE 3
#define BINARY_VALUE 4
//handle prefix bit codes(these get appended to the actual memmap offset to generate a handle)
#define KEYBITCODE 0x6900
#define VALUEBITCODE 0xAB00
#define ROOTBITCODE 0x1234
//in case we want multiple roots, this can expand
#define ROOT_MAIN 0x0000
//this is the main root keys handle define
#define MAIN_ROOT_KEY MAKELONG(ROOT_MAIN,ROOTBITCODE)
//typedefs for each kind of handle
typedef DWORD KEY_HANDLE,*LPKEY_HANDLE;
typedef DWORD VALUE_HANDLE,*LPVALUE_HANDLE;
typedef DWORD EVENT_HANDLE,*LPEVENT_HANDLE;
//this structure is an internal status structure
//my test app accesses this for debug. You should never need this.
typedef struct INFODATASTRUCT
{
UINT uBindCount;
UINT uNumKeys;
UINT uMaxKeys;
UINT uNumValues;
UINT uMaxValues;
UINT uNumTableEntries;
UINT uMaxTableEntries;
UINT uNumEvents;
UINT uMaxEvents;
DWORD dwBytesFree;
DWORD dwMaxChars;
} INFO_DATA, *LPINFO_DATA;
//function typedefs
//supplier
typedef HRESULT (*ISD_CREATEKEY) (KEY_HANDLE, LPCSTR, LPKEY_HANDLE);
typedef HRESULT (*ISD_CREATEVALUE) (KEY_HANDLE, LPCSTR, DWORD,CONST BYTE *,DWORD,LPVALUE_HANDLE);
typedef HRESULT (*ISD_SETVALUE) (KEY_HANDLE, VALUE_HANDLE, LPCSTR, DWORD, CONST BYTE *, DWORD);
//consumer
typedef HRESULT (*ISD_OPENKEY) (KEY_HANDLE, LPCSTR, LPKEY_HANDLE);
typedef HRESULT (*ISD_OPENVALUE) (KEY_HANDLE, LPCSTR, LPVALUE_HANDLE);
typedef HRESULT (*ISD_ENUMKEY) (KEY_HANDLE, DWORD, LPSTR, LPDWORD, LPKEY_HANDLE);
typedef HRESULT (*ISD_ENUMVALUE) (KEY_HANDLE, DWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD, LPDWORD, LPVALUE_HANDLE);
typedef HRESULT (*ISD_QUERYINFOKEY) (KEY_HANDLE, LPSTR, LPDWORD, LPDWORD, LPDWORD);
typedef HRESULT (*ISD_QUERYINFOVALUE) (VALUE_HANDLE, LPSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD, LPDWORD, LPKEY_HANDLE);
typedef HRESULT (*ISD_NOTIFYCHANGEVALUE) (VALUE_HANDLE, HANDLE);
//used by either
typedef HRESULT (*ISD_DELETEKEY) (KEY_HANDLE);
typedef HRESULT (*ISD_DELETEVALUE) (KEY_HANDLE, VALUE_HANDLE, LPCSTR);
typedef BOOL (*ISD_GETSTRUCTDATA) (LPINFO_DATA);
typedef BOOL (*ISD_ISVALIDKEYHANDLE) (KEY_HANDLE);
typedef BOOL (*ISD_ISVALIDVALUEHANDLE) (VALUE_HANDLE);
typedef HRESULT (*ISD_COMPACTMEMORY) ();
//structure for ISDM entry points
typedef struct _ISDM2API
{
ISD_CREATEKEY ISD_CreateKey;
ISD_CREATEVALUE ISD_CreateValue;
ISD_SETVALUE ISD_SetValue;
ISD_OPENKEY ISD_OpenKey;
ISD_OPENVALUE ISD_OpenValue;
ISD_ENUMKEY ISD_EnumKey;
ISD_ENUMVALUE ISD_EnumValue;
ISD_QUERYINFOKEY ISD_QueryInfoKey;
ISD_QUERYINFOVALUE ISD_QueryInfoValue;
ISD_NOTIFYCHANGEVALUE ISD_NotifyChangeValue;
ISD_DELETEKEY ISD_DeleteKey;
ISD_DELETEVALUE ISD_DeleteValue;
ISD_GETSTRUCTDATA ISD_GetStructData;
ISD_ISVALIDKEYHANDLE ISD_IsValidKeyHandle;
ISD_ISVALIDVALUEHANDLE ISD_IsValidValueHandle;
ISD_COMPACTMEMORY ISD_CompactMemory;
}
ISDM2API, *LPISDM2API;
//HRESULT error defines
#define ISDM_ERROR_BASEB 0x8000
#define ERROR_INVALID_KEY_HANDLE ISDM_ERROR_BASEB + 1
#define ERROR_MORE_DATA_AVAILABLE ISDM_ERROR_BASEB + 2
#define ERROR_INVALID_STRING_POINTER ISDM_ERROR_BASEB + 3
#define ERROR_KEY_NOT_FOUND ISDM_ERROR_BASEB + 4
#define ERROR_VALUE_NOT_FOUND ISDM_ERROR_BASEB + 5
#define ERROR_NO_MORE_SESSIONS ISDM_ERROR_BASEB + 6
#define ERROR_INVALID_VALUE_HANDLE ISDM_ERROR_BASEB + 7
#define ERROR_FAILED_TO_GET_MEM_KEY ISDM_ERROR_BASEB + 8
#define ERROR_NO_PARENT ISDM_ERROR_BASEB + 9
#define ERROR_NO_PREV_SIBLING ISDM_ERROR_BASEB + 10
#define ERROR_NO_NEXT_SIBLING ISDM_ERROR_BASEB + 11
#define ERROR_NO_CHILD ISDM_ERROR_BASEB + 12
#define ERROR_INVALID_VALUE_TYPE ISDM_ERROR_BASEB + 13
#define ERROR_MALLOC_FAILURE ISDM_ERROR_BASEB + 14
#define ERROR_CREATE_KEY_FAILURE ISDM_ERROR_BASEB + 15
#define ERROR_NULL_PARAM ISDM_ERROR_BASEB + 16
#define ERROR_VALUE_EXISTS ISDM_ERROR_BASEB + 17
#define ERROR_FAILED_TO_GET_MEM_VALUE ISDM_ERROR_BASEB + 18
#define ERROR_NO_MORE_STR_SPACE ISDM_ERROR_BASEB + 19
#define ERROR_KEY_EXISTS ISDM_ERROR_BASEB + 20
#define ERROR_NO_MORE_KEY_SPACE ISDM_ERROR_BASEB + 21
#define ERROR_NO_MORE_VALUE_SPACE ISDM_ERROR_BASEB + 22
#define ERROR_INVALID_PARAM ISDM_ERROR_BASEB + 23
#define ERROR_ROOT_DELETE ISDM_ERROR_BASEB + 24
#define ERROR_NULL_STRING_TABLE_ENTRY ISDM_ERROR_BASEB + 25
#define ERROR_NO_MORE_TABLE_ENTRIES ISDM_ERROR_BASEB + 26
#define ERROR_ISDM_UNKNOWN ISDM_ERROR_BASEB + 27
#define ERROR_NOT_IMPLEMENTED ISDM_ERROR_BASEB + 28
#define ERROR_MALLOC_FAILED ISDM_ERROR_BASEB + 29
#define ERROR_FAILED_TO_GET_MEM_TABLE ISDM_ERROR_BASEB + 30
#define ERROR_SEMAPHORE_WAIT_FAIL ISDM_ERROR_BASEB + 31
#define ERROR_NO_MORE_EVENTS ISDM_ERROR_BASEB + 32
#define ERROR_INVALID_EVENT ISDM_ERROR_BASEB + 33
#define ERROR_INVALID_EVENT_HANDLE ISDM_ERROR_BASEB + 34
#define ERROR_EVENT_NONEXISTANT ISDM_ERROR_BASEB + 35
#define ERROR_VALUE_DOES_NOT_EXIST ISDM_ERROR_BASEB + 36
#define ERROR_BUFFER_TOO_SMALL ISDM_ERROR_BASEB + 37
//token defines..these may just disappear
//RRCM
#define RRCM_LOCAL_STREAM 1
#define RRCM_REMOTE_STREAM 2
#define ISDM_RRCM_BASE 0x1000
#define ISDM_SSRC ISDM_RRCM_BASE + 1
#define ISDM_NUM_PCKT_SENT ISDM_RRCM_BASE + 2
#define ISDM_NUM_BYTES_SENT ISDM_RRCM_BASE + 3
#define ISDM_FRACTION_LOST ISDM_RRCM_BASE + 4
#define ISDM_CUM_NUM_PCKT_LOST ISDM_RRCM_BASE + 5
#define ISDM_XTEND_HIGHEST_SEQ_NUM ISDM_RRCM_BASE + 6
#define ISDM_INTERARRIVAL_JITTER ISDM_RRCM_BASE + 7
#define ISDM_LAST_SR ISDM_RRCM_BASE + 8
#define ISDM_DLSR ISDM_RRCM_BASE + 9
#define ISDM_NUM_BYTES_RCVD ISDM_RRCM_BASE + 10
#define ISDM_NUM_PCKT_RCVD ISDM_RRCM_BASE + 11
#define ISDM_NTP_FRAC ISDM_RRCM_BASE + 12
#define ISDM_NTP_SEC ISDM_RRCM_BASE + 13
#define ISDM_WHO_AM_I ISDM_RRCM_BASE + 14
//
//Supplier API
//
//NOTE: always refer to the Win32 Registry equivalent call for more information on the functionality of the call
//The create key call is similar to the RegCreateKeyEx call from Win32 in functionality
//NOTE: This call will create the new key or simply return the handle of the key if it already
//exists
extern DllExport HRESULT ISD_CreateKey
(
KEY_HANDLE hParentKey, //The key from which to create the new key(can be MAIN_ROOT_KEY)
LPCSTR lpSubKey, //the subkey to create.(see RegCreateKeyEx for details)
LPKEY_HANDLE lphReturnKey//the handle of the newly created key
);
//The create value call is not part of the Win32 reg calls. It is here for symmetry in my API
//I prefer to use CreateValue then SetValue for my values, you can simply use SetValue and ignore
//CreateValue if you wish. The reason the registry has no such call is because they don't have
//a notion of a handle to a value. I felt it was very useful to have direct handles to the values for
//subsequent supplier or consumer calls.
//NOTE: If the type is STRING, you need to include the null terminator for the string in the size(cbData).
extern DllExport HRESULT ISD_CreateValue
(
KEY_HANDLE hKey, //handle to the key that will own the new value
LPCSTR lpName, //string ID of the value to be create
DWORD dwType, //type of value to create(DWORD,STRING,BINARY)
CONST BYTE *lpData, //pointer to value data
DWORD cbData, //size of the value data buffer
LPVALUE_HANDLE lphReturnValue //return handle to the newly created value
);
//SetValue is similar to the Win32 RegSetValueEx call
//Note: If you have the value handle, you don't need to pass the key handle or lpName
//NOTE: If the type is STRING, you need to include the null terminator for the string in the size(cbData).
DllExport HRESULT ISD_SetValue
(
KEY_HANDLE hKey, //handle of valid key(can be NULL if hValue is known)
VALUE_HANDLE hValue, //handle of value to set(can be NULL)
LPCSTR lpName, //address of value name of value to set(can be NULL if hkey is null)
DWORD dwType, //flag for value type
CONST BYTE *lpData, //address of value data
DWORD cbData //size of value data
);
//
//Consumer API
//
//The OpenKey call is similar to the Win32 RegOpenKeyEx call
DllExport HRESULT ISD_OpenKey
(
KEY_HANDLE hKey, //handle of a valid key(can be MAIN_ROOT_KEY)
LPCSTR lpSubKey, //name of subkey to open
LPKEY_HANDLE lphReturnKey //handle of the opened key
);
//The OpenValue call is new to ISDM because the registry doesn't have a concept of value handles
DllExport HRESULT ISD_OpenValue
(
KEY_HANDLE hKey, //handle of a valid key(can NOT be MAIN_ROOT_KEY)
LPCSTR lpValueName, //Name of value to open
LPVALUE_HANDLE lphReturnValue //handle of the opened value
);
//The EnumKey call is similar to the Win32 RegEnumKey call
//NOTES:
// If lpName is null the size of the name is returned into lpcbName and NOERROR is returned
DllExport HRESULT ISD_EnumKey
(
KEY_HANDLE hKey, //key to enumerate
DWORD dwIndex, //index of subkey to enumerate
LPSTR lpName, //address of buffer for subkey name(can be NULL)
LPDWORD lpcbName, //address for size of subkey buffer (acts like the RegEnumKeyEx version of this param)
LPKEY_HANDLE lphReturnKey //handle of subkey(can be NULL)
);
//The EnumValue call is similar to the Win32 RegEnumValue call
DllExport HRESULT ISD_EnumValue
(
KEY_HANDLE hKey, //handle of key where value resides
DWORD dwIndex, //index of value to enum
LPSTR lpName, //address of buffer for value name(can be NULL)
LPDWORD lpcbName, //address for size of value name buffer(can be NULL only if lpName is NULL)
LPDWORD lpType, //address for type of value(can be NULL if you don't care about type)
LPBYTE lpData, //address of buffer to receive the value data(can be NULL)
LPDWORD lpcbData, //address of size of buffer to receive the value data(can be NULL only if lpData is NULL)
LPDWORD lpTimeStamp, //address for timestamp on value(when last updated)(can be NULL)
LPVALUE_HANDLE lphReturnValue //address for handle of value(can be NULL)
);
//The QueryKeyInfo call is similar to the RegQueryInfoKey
DllExport HRESULT ISD_QueryInfoKey
(
KEY_HANDLE hKey, //handle of a valid key(can be MAIN_ROOT_KEY)
LPSTR lpKeyName, //buffer to receive the name of the key(can be NULL)
LPDWORD lpcbKeyName, //address of size of name buffer(can be null only if lpKeyName is NULL)
LPDWORD lpcNumKeys, //address for number of direct children of the key(can be NULL)
LPDWORD lpcNumValues //address for number of values under the key(can be NULL)
);
//The QueryValueInfo call is NOT similar to the Win32 RegQueryValueEx call
//you must supply a value handle, the Win32 call doesn't have a notion of such a thing
//You can get the handle with subsequent calls to EnumKey
//This is my consumer call to retrieve statistical data
//NOTES:
// If lpData is NULL and lpcbData is not, the function will return NOERROR with
// lpcbData containing the buffer size needed for the value
// If lpName is NULL and lpcbName is not, the function will return NOERROR with
// lpcbName containing the buffer size needed for the value
DllExport HRESULT ISD_QueryInfoValue
(
VALUE_HANDLE hValue, //handle of value to query
LPSTR lpName, //buffer to receive the name of the value(can be NULL)
LPDWORD lpcbName, //size of the name buffer(can only be NULL if lpName is NULL)
LPDWORD lpValueType, //address to receive the value type
LPBYTE lpData, //buffer to receive the value data(can be NULL)
LPDWORD lpcbData, //size of the value data buffer(can only be NULL if lpData is NULL)
LPDWORD lpTime, //address for timestamp on value(when last updated)(can be NULL)
LPKEY_HANDLE lphParentKey //return handle of the key that owns the value(can be NULL)
);
//NotifyChangeValue is somewhat similar to the Win32 RegNotifyChangeValue call
//I limit you to async notification and also to value notification(no key level notify..yet)
DllExport HRESULT ISD_NotifyChangeValue
(
VALUE_HANDLE hValue, //handle of the value to trigger an event from
HANDLE hEvent //handle to the event you want triggered when value changes
);
//
//shared API
//
//The DeleteKey call is similar to RegDeleteKey
DllExport HRESULT ISD_DeleteKey
(
KEY_HANDLE hKey //handle of key to delete
);
//The DeleteValue call is similar to the RegDeleteValue call
//NOTE: You must supply either hValue or lpValueName. If you have the hValue, use it
//and pass NULL for the value name.
DllExport HRESULT ISD_DeleteValue
(
KEY_HANDLE hKey, //handle of key that owns the value..if you have the value handle..pass NULL
VALUE_HANDLE hValue, //handle of value to delete(if known)..if known..pass NULL for key handle and name value
LPCSTR lpValueName //buffer holding name of value to delete(if known) pass NULL when hValue is known
);
//The GetStructData call is for retrieving structural info on ISDM itself. This is exposed so
//my test app can check the data structs. You should not need to call this.
DllExport BOOL ISD_GetStructData
(
LPINFO_DATA pInfo //structure holding ISDM structural info
);
//
//Handle validation calls
//
//use these anytime you want to check the validity of a handle to an ISDM object
DllExport BOOL ISD_IsValidKeyHandle
(
KEY_HANDLE hKey //handle to key
);
DllExport BOOL ISD_IsValidValueHandle
(
VALUE_HANDLE hValue //handle to value
);
//CompactMemory is my garbage collection function for ISDM. It is exported for
//test purposes with my browser app. You don't ever need to call this.
DllExport HRESULT ISD_CompactMemory
(
);
#ifdef __cplusplus
} // End of extern "C" {
#endif // __cplusplus
#endif // __ISDMAPI2_H__