////////////////////////////////////////////////////////////////////
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
// All rights reserved
// This file was released under the GPLv2 on June 2015.
////////////////////////////////////////////////////////////////////

/*************************************************************************
*
* File: user_lib.h
*
* Module: User-mode library header
*
* Description: common useful user-mode functions
*
* Author: Ivan
*
*************************************************************************/


#ifndef __USER_LIB_H__
#define __USER_LIB_H__

#if defined DBG || defined PRINT_ALWAYS
#define ODS(sz) OutputDebugString(sz)
#else
#define ODS(sz) {}
#endif 

#define arraylen(a)     (sizeof(a)/sizeof(a[0]))

/// CD/DVD-RW device types
typedef enum _JS_DEVICE_TYPE {
    OTHER = 0,
    CDR,
    CDRW,
    DVDROM,
    DVDRAM,
    DVDR,
    DVDRW,
    DVDPR,
    DVDPRW,
    DDCDROM,
    DDCDR,
    DDCDRW,
    BDROM,
    BDRE,
    BUSY
} JS_DEVICE_TYPE;

extern TCHAR* MediaTypeStrings[];

/// Service state constants
typedef enum _JS_SERVICE_STATE {
    JS_SERVICE_NOT_PRESENT, ///< Service not installed
    JS_SERVICE_RUNNING,     ///< Service is running
    JS_SERVICE_NOT_RUNNING, ///< Service installed, but not running
    JS_ERROR_STATUS         ///< Errror while taking service status
} JS_SERVICE_STATE;

void * __cdecl mymemchr (
        const void * buf,
        int chr,
        size_t cnt
        );

char * __cdecl mystrrchr (
        const char * string,
        int ch
        );

char * __cdecl  mystrchr (
        const char * string,
        int ch
        );

int __cdecl Exist (
        PCHAR path
        );

ULONG MyMessageBox(
    HINSTANCE hInst,
    HWND hWnd,
    LPCSTR pszFormat,
    LPCSTR pszTitle,
    UINT fuStyle,
    ...
    );

// simple win32 registry api wrappers
BOOL RegisterString (LPSTR pszKey, LPSTR pszValue, LPSTR pszData,BOOLEAN MultiSz,DWORD size);
BOOL
GetRegString (
  LPSTR pszKey,
  LPSTR pszValue,
  LPSTR pszData,
  DWORD dwBufSize
  );
BOOL RegDelString   (LPSTR pszKey, LPSTR pszValue);
BOOL RegisterDword  (LPSTR pszKey, LPSTR pszValue, DWORD dwData);
BOOL
GetRegUlong (
  LPSTR pszKey,
  LPSTR pszValue,
  LPDWORD pszData
  );


JS_SERVICE_STATE
ServiceInfo(
    LPCTSTR ServiceName
    );

BOOL
CheckCdrwFilter(
    BOOL ReInstall
    );

BOOL
Privilege(
    LPTSTR pszPrivilege,
    BOOL bEnable
    );

BOOL IsWow64(VOID);

#define         DW_GLOBAL_QUIT_EVENT_NAME   L"Global\\DwQuitEvent"
#define         DW_QUIT_EVENT_NAME   L"DwQuitEvent"

HANDLE
CreatePublicEvent(
    PWCHAR EventName
    );

ULONG
UDFPhSendIOCTL(
    IN ULONG IoControlCode,
    IN HANDLE DeviceObject,
    IN PVOID InputBuffer ,
    IN ULONG InputBufferLength,
    OUT PVOID OutputBuffer ,
    IN ULONG OutputBufferLength,
    IN BOOLEAN OverrideVerify,
    IN PVOID Dummy
    );

PCHAR
UDFGetDeviceName(
    PCHAR szDeviceName
    );

BOOL
GetOptUlong(
    PCHAR Path,
    PCHAR OptName,
    PULONG OptVal
    );

BOOL
SetOptUlong(
    PCHAR Path,
    PCHAR OptName,
    PULONG OptVal
    );

#define UDF_OPTION_GLOBAL     1
#define UDF_OPTION_MEDIASPEC  10
#define UDF_OPTION_DEVSPEC    2
#define UDF_OPTION_DISKSPEC   3
#define UDF_OPTION_MAX_DEPTH  0xffffffff

ULONG
UDFGetOptUlongInherited(
    PCHAR Drive,
    PCHAR OptName,
    PULONG OptVal,
    ULONG CheckDepth
    );

HANDLE
OpenOurVolume(
    PCHAR szDeviceName
    );

ULONG
drv_letter_to_index(
    WCHAR a
    );

DWORD
WINAPI
LauncherRoutine2(
    LPVOID lpParameter
    );

#endif // __USER_LIB_H__