#ifndef __WINE_HANDLE32_H
#define __WINE_HANDLE32_H

#include <malloc.h>
#include "wintypes.h"

/* The _*_OBJECT structures contain information needed about each
 * particular type of handle.  This information is a combination of
 * equivalent UNIX-style handles/descriptors and general information
 * that the Win32 API might request.
 *
 * The KERNEL_OBJECT structure must be the first member of any specific
 * kernel object type's structure.
 */

typedef struct {
    unsigned long       magic;
} KERNEL_OBJECT, *HANDLE32;

typedef struct {
    KERNEL_OBJECT       common;
    unsigned long       thread_id;
    unsigned long       process_id;
} THREAD_OBJECT;

typedef struct {
    KERNEL_OBJECT       common;
    unsigned long       process_id;
    unsigned long       main_thread_id;
} PROCESS_OBJECT;

/* The FILE object includes things like disk files, pipes, and
 * character devices (com ports, consoles, ...).
 */
typedef struct {
    KERNEL_OBJECT       common;
    int                 fd;                 /* UNIX fd */
    int                 type;               /* FILE_TYPE_* */
    unsigned long       misc_flags;         /* special flags */
    unsigned long       access_flags;       /* UNIX access flags */
    unsigned long       create_flags;       /* UNIX creation flags */
} FILE_OBJECT;

typedef struct {
    KERNEL_OBJECT	common;
    FILE_OBJECT	       *file_obj;
    int			prot;
    unsigned long	size;
} FILEMAP_OBJECT;

typedef struct {
    KERNEL_OBJECT       common;
} SEMAPHORE_OBJECT;

typedef struct {
    KERNEL_OBJECT       common;
} EVENT_OBJECT;

/* Should this even be here?
 */
typedef struct {
    KERNEL_OBJECT       common;
} REGKEY_OBJECT;

typedef struct _VRANGE_OBJECT{
	KERNEL_OBJECT		common;
	DWORD				start;
	DWORD				size;
	struct _VRANGE_OBJECT *next;
} VRANGE_OBJECT;

struct _HEAPITEM_OBJECT;
typedef struct{
	KERNEL_OBJECT		common;
	LPVOID	start;
	DWORD	size;
	DWORD	maximum;
	DWORD	flags;
	struct _HEAPITEM_OBJECT *first,*last;
} HEAP_OBJECT;

typedef struct _HEAPITEM_OBJECT{
	KERNEL_OBJECT	common;
	HEAP_OBJECT	*heap;
	DWORD size;		/* size including header */
	struct _HEAPITEM_OBJECT *next,*prev;
} HEAPITEM_OBJECT;


/* Object number definitions.  These numbers are used to
 * validate the kernel object by comparison against the
 * object's 'magic' value.
  */
#define KERNEL_OBJECT_UNUSED    2404554046UL
#define KERNEL_OBJECT_THREAD    (KERNEL_OBJECT_UNUSED + 1)
#define KERNEL_OBJECT_PROCESS   (KERNEL_OBJECT_UNUSED + 2)
#define KERNEL_OBJECT_FILE      (KERNEL_OBJECT_UNUSED + 3)
#define KERNEL_OBJECT_SEMAPHORE (KERNEL_OBJECT_UNUSED + 4)
#define KERNEL_OBJECT_EVENT     (KERNEL_OBJECT_UNUSED + 5)
#define KERNEL_OBJECT_REGKEY    (KERNEL_OBJECT_UNUSED + 6)
#define KERNEL_OBJECT_FILEMAP   (KERNEL_OBJECT_UNUSED + 7)
#define KERNEL_OBJECT_VRANGE    (KERNEL_OBJECT_UNUSED + 8)
#define KERNEL_OBJECT_HEAP      (KERNEL_OBJECT_UNUSED + 9)
#define KERNEL_OBJECT_HEAPITEM  (KERNEL_OBJECT_UNUSED + 10)

/* Define the invalid handle value
 */
#define INVALID_HANDLE_VALUE    ((HANDLE32)-1)

/* Functions for checking kernel objects.
 */
int ValidateKernelObject(KERNEL_OBJECT *ptr);

/* For now, CreateKernelObject and ReleaseKernelObject will
 * simply map to malloc() and free().
 */
#define CreateKernelObject(size) (malloc(size))
#define ReleaseKernelObject(ptr) (free(ptr))

/* Prototypes for the Close*Handle functions
 */
int CloseFileHandle(FILE_OBJECT *hFile);

#endif /* __WINE_HANDLE32_H */
