#ifndef __WINE_HANDLE32_H
#define __WINE_HANDLE32_H

#include <stdlib.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;

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;

typedef struct {
    KERNEL_OBJECT	common;
    HFILE		hfile;
    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)

/* 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(HFILE hFile);

#endif /* __WINE_HANDLE32_H */
