using System.Runtime.InteropServices;
using System.Text;
namespace Vanara.PInvoke
{
public static partial class Kernel32
{
/// The handle identifying the source file is not valid. The file cannot be read.
public const int LZERROR_BADINHANDLE = (-1);
/// The handle identifying the destination file is not valid. The file cannot be written.
public const int LZERROR_BADOUTHANDLE = (-2);
/// One of the parameters is outside the range of acceptable values.
public const int LZERROR_BADVALUE = (-7);
/// The maximum number of open compressed files has been exceeded or local memory cannot be allocated.
public const int LZERROR_GLOBALLOC = (-5);
/// The LZ file handle cannot be locked down.
public const int LZERROR_GLOBLOCK = (-6);
/// The source file format is not valid.
public const int LZERROR_READ = (-3);
/// The file is compressed with an unrecognized compression algorithm.
public const int LZERROR_UNKNOWNALG = (-8);
/// There is insufficient space for the output file.
public const int LZERROR_WRITE = (-4);
/// Retrieves the original name of a compressed file, if the file was compressed by the Lempel-Ziv algorithm.
/// The name of the compressed file.
/// A pointer to a buffer that receives the original name of the compressed file.
///
/// If the function succeeds, the return value is 1.
///
/// If the function fails, the return value is LZERROR_BADVALUE. There is no extended error information for this function; do not
/// call GetLastError.
///
///
// INT WINAPI GetExpandedName( _In_ LPTSTR lpszSource, _Out_ LPTSTR lpszBuffer); https://msdn.microsoft.com/en-us/library/windows/desktop/aa364941(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, CharSet = CharSet.Auto)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa364941")]
public static extern int GetExpandedName(string lpszSource, StringBuilder lpszBuffer);
/// Closes a file that was opened by using the LZOpenFile function.
/// A handle to the file to be closed.
/// This function does not return a value.
// void APIENTRY LZClose( _In_ INT hFile); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365221(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365221")]
public static extern void LZClose(int hFile);
///
/// Copies a source file to a destination file. If the source file has been compressed by the Lempel-Ziv algorithm, this function
/// creates a decompressed destination file. If the source file is not compressed, this function duplicates the original file.
///
/// A handle to the source file.
/// A handle to the destination file.
///
/// If the function succeeds, the return value specifies the size, in bytes, of the destination file.
///
/// If the function fails, the return value is an LZERROR_* code. These codes have values less than zero. Note that LZCopy
/// calls neither SetLastError nor SetLastErrorEx; thus, its failure does not affect a thread's last-error code.
///
/// The following is a list of error codes that LZCopy can return upon failure.
///
///
///
/// Return code
/// Description
///
/// -
/// LZERROR_BADINHANDLE
/// The handle identifying the source file is not valid. The file cannot be read.
///
/// -
/// LZERROR_BADOUTHANDLE
/// The handle identifying the destination file is not valid. The file cannot be written.
///
/// -
/// LZERROR_GLOBALLOC
/// The maximum number of open compressed files has been exceeded or local memory cannot be allocated.
///
/// -
/// LZERROR_GLOBLOCK
/// The LZ file handle cannot be locked down.
///
/// -
/// LZERROR_READ
/// The source file format is not valid.
///
///
///
/// There is no extended error information for this function; do not call GetLastError.
///
// LONG WINAPI LZCopy( _In_ INT hfSource, _In_ INT hfDest); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365223(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365223")]
public static extern int LZCopy(int hfSource, int hfDest);
///
/// Allocates memory for the internal data structures required to decompress files, and then creates and initializes them.
///
/// A handle to the file.
///
/// If the function succeeds, the return value is a new LZ file handle.
///
/// If the function fails, the return value is an LZERROR_* code. These codes have values less than zero. Note that LZInit
/// calls neither SetLastError nor SetLastErrorEx; thus, its failure does not affect a thread's last-error code.
///
/// The following is the list of the error codes that LZInit can return upon failure.
///
///
///
/// Return code
/// Description
///
/// -
/// LZERROR_BADINHANDLE
/// The handle identifying the source file is not valid. The file cannot be read.
///
/// -
/// LZERROR_GLOBALLOC
/// The maximum number of open compressed files has been exceeded or local memory cannot be allocated.
///
/// -
/// LZERROR_GLOBLOCK
/// The LZ file handle cannot be locked down.
///
/// -
/// LZERROR_UNKNOWNALG
/// The file is compressed with an unrecognized compression algorithm.
///
///
///
/// There is no extended error information for this function; do not call GetLastError.
///
// INT WINAPI LZInit( _In_ INT hfSource); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365224(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365224")]
public static extern int LZInit(int hfSource);
/// Creates, opens, reopens, or deletes the specified file.
/// The name of the file.
///
///
/// A pointer to the OFSTRUCT structure that is to receive information about the file when the file is first opened. The
/// structure can be used in subsequent calls to the LZOpenFile function to see the open file.
///
///
/// The szPathName member of this structure contains characters from the original equipment manufacturer (OEM) character set.
///
///
///
/// The action to be taken. This parameter can be one or more of the following values.
///
///
///
/// Value
/// Meaning
///
/// -
/// OF_CANCEL0x0800
///
/// Ignored. Provided only for compatibility with 16-bit Windows. Use the OF_PROMPT style to display a dialog box containing a
/// Cancel button.
///
///
/// -
/// OF_CREATE0x1000
/// Directs LZOpenFile to create a new file. If the file already exists, it is truncated to zero length.
///
/// -
/// OF_DELETE0x0200
/// Deletes the file.
///
/// -
/// OF_EXIST0x4000
/// Opens the file and then closes it to test for a file's existence.
///
/// -
/// OF_PARSE0x0100
/// Fills the OFSTRUCT structure but carries out no other action.
///
/// -
/// OF_PROMPT0x2000
///
/// Displays a dialog box if the requested file does not exist. The dialog box informs the user that the system cannot find the
/// file, and it contains Retry and Cancel buttons. Clicking the Cancel button directs LZOpenFile to return a file not found error message.
///
///
/// -
/// OF_READ0x0000
/// Opens the file for reading only.
///
/// -
/// OF_READWRITE0x0002
/// Opens the file for reading and writing.
///
/// -
/// OF_REOPEN0x8000
/// Opens the file using information in the reopen buffer.
///
/// -
/// OF_SHARE_DENY_NONE0x0040
///
/// Opens the file without denying other processes read or write access to the file. LZOpenFile fails if the file has been opened in
/// compatibility mode by any other process.
///
///
/// -
/// OF_SHARE_DENY_READ0x0030
///
/// Opens the file and denies other processes read access to the file. LZOpenFile fails if the file has been opened in compatibility
/// mode or has been opened for read access by any other process.
///
///
/// -
/// OF_SHARE_DENY_WRITE0x0020
///
/// Opens the file and denies other processes write access to the file. LZOpenFile fails if the file has been opened in
/// compatibility mode or has been opened for write access by any other process.
///
///
/// -
/// OF_SHARE_EXCLUSIVE0x0010
///
/// Opens the file in exclusive mode, denying other processes both read and write access to the file. LZOpenFile fails if the file
/// has been opened in any other mode for read or write access, even by the current process.
///
///
/// -
/// OF_WRITE0x0001
/// Opens the file for writing only.
///
///
///
///
///
///
/// If the function succeeds and the value specified by the wStyle parameter is not OF_READ, the return value is a handle
/// identifying the file. If the file is compressed and opened with wStyle set to OF_READ, the return value is a special file handle.
///
///
/// If the function fails, the return value is an LZERROR_* code. These codes have values less than zero. There is no
/// extended error information for this function; do not call GetLastError.
///
/// The following is the list of the error codes that LZOpenFile can return upon failure.
///
///
///
/// Return code/value
/// Description
///
/// -
/// LZERROR_BADINHANDLE-1
/// The handle identifying the source file is not valid. The file cannot be read.
///
/// -
/// LZERROR_GLOBALLOC-5
/// The maximum number of open compressed files has been exceeded or local memory cannot be allocated.
///
///
///
///
// INT WINAPI LZOpenFile( _In_ LPTSTR lpFileName, _Out_ LPOFSTRUCT lpReOpenBuf, _In_ WORD wStyle); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365225(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, CharSet = CharSet.Auto)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365225")]
public static extern int LZOpenFile(string lpFileName, out OFSTRUCT lpReOpenBuf, ushort wStyle);
/// Reads (at most) the specified number of bytes from a file and copies them into a buffer.
/// A handle to the file.
///
/// A pointer to a buffer that receives the bytes read from the file. Ensure that this buffer is larger than cbRead.
///
/// The count of bytes to be read.
///
/// If the function succeeds, the return value specifies the number of bytes read.
///
/// If the function fails, the return value is an LZERROR_* code. These codes have values less than zero. Note that LZRead
/// calls neither SetLastError nor SetLastErrorEx; thus, its failure does not affect a thread's last-error code.
///
/// The following is the list of error codes that LZRead can return upon failure.
///
///
///
/// Return code
/// Description
///
/// -
/// LZERROR_BADINHANDLE
/// The handle identifying the source file is not valid. The file cannot be read.
///
/// -
/// LZERROR_BADOUTHANDLE
/// The handle identifying the destination file is not valid. The file cannot be written.
///
/// -
/// LZERROR_BADVALUE
/// One of the input parameters is not valid.
///
/// -
/// LZERROR_GLOBALLOC
/// The maximum number of open compressed files has been exceeded or local memory cannot be allocated.
///
/// -
/// LZERROR_GLOBLOCK
/// The LZ file handle cannot be locked down.
///
/// -
/// LZERROR_READ
/// The source file format is not valid.
///
/// -
/// LZERROR_WRITE
/// There is insufficient space for the output file.
///
///
///
/// There is no extended error information for this function; do not call GetLastError.
///
// INT WINAPI LZRead( _In_ INT hFile, _Out_ LPSTR lpBuffer, _In_ INT cbRead); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365226(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365226")]
public static extern int LZRead(int hFile, StringBuilder lpBuffer, int cbRead);
/// Moves a file pointer the specified number of bytes from a starting position.
/// A handle to the file.
/// The number of bytes by which to move the file pointer.
///
/// The starting position of the pointer. This parameter must be one of the following values.
///
///
///
/// Value
/// Meaning
///
/// -
/// 0
/// Moves the file pointer lOffset bytes from the beginning of the file.
///
/// -
/// 1
/// Moves the file pointer lOffset bytes from the current position.
///
/// -
/// 2
/// Moves the file pointer lOffset bytes from the end of the file.
///
///
///
///
///
/// If the function succeeds, the return value specifies the offset from the beginning of the file to the new pointer position.
///
/// If the function fails, the return value is an LZERROR_* code. These codes have values less than zero. Note that LZSeek
/// calls neither SetLastError nor SetLastErrorEx; thus, its failure does not affect a thread's last-error code.
///
/// The following is the list of error codes that LZSeek can return upon failure.
///
///
///
/// Return code
/// Description
///
/// -
/// LZERROR_BADINHANDLE
/// The handle identifying the source file is not valid. The file cannot be read.
///
/// -
/// LZERROR_BADVALUE
/// One of the parameters is outside the range of acceptable values.
///
/// -
/// LZERROR_GLOBLOCK
/// The LZ file handle cannot be locked down.
///
///
///
/// There is no extended error information for this function; do not call GetLastError.
///
// LONG WINAPI LZSeek( _In_ INT hFile, _In_ LONG lOffset, _In_ INT iOrigin); https://msdn.microsoft.com/en-us/library/windows/desktop/aa365227(v=vs.85).aspx
[DllImport(Lib.Kernel32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("LzExpand.h", MSDNShortId = "aa365227")]
public static extern int LZSeek(int hFile, int lOffset, int iOrigin);
}
}