/*
 * Win32 kernel functions
 *
 * Copyright 1995 Martin von Loewis and Cameron Heide
 */

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
#include "handle32.h"
#include "stddebug.h"
#include "debug.h"
  
/* The global error value
 */
int WIN32_LastError;

/* Standard system handles for stdin, stdout, and stderr.
 */
FILE_OBJECT *hstdin, *hstdout, *hstderr;

static int CreateStdHandles(void);

/*********************************************************************
 *              CloseHandle             (KERNEL32.23)
 */
BOOL CloseHandle(HANDLE32 handle)
{
    int rc;

    if(ValidateKernelObject(handle) != 0)
    {
        SetLastError(ERROR_INVALID_HANDLE);
        return 0;
    }

    switch(handle->magic)
    {
        case KERNEL_OBJECT_UNUSED:
            SetLastError(ERROR_INVALID_HANDLE);
            return 0;

        case KERNEL_OBJECT_FILE:
            rc = CloseFileHandle((FILE_OBJECT *)handle);
            break;

        default:
            printf("CloseHandle: type %ld not implemented yet.\n",
                   handle->magic);
            break;
    }

    ReleaseKernelObject(handle);
    return 0;
}

/***********************************************************************
 *              GetModuleFileNameA      (KERNEL32.235)
 */
DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
{
    strcpy(lpFilename, "c:\\dummy");
    return 8;
}

/***********************************************************************
 *              GetModuleHandle         (KERNEL32.237)
 */
HMODULE WIN32_GetModuleHandle(char *module)
{
    if(module == NULL)
        return (HMODULE)0;
    else
        return GetModuleHandle(module);
}

/***********************************************************************
 *              GetStartupInfoA         (KERNEL32.273)
 */
VOID GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
{
    lpStartupInfo->cb = sizeof(STARTUPINFO);
    lpStartupInfo->lpReserved = NULL;
    lpStartupInfo->lpDesktop = "Desktop";
    lpStartupInfo->lpTitle = "Title";

    lpStartupInfo->lpReserved2 = NULL; /* must be NULL for VC runtime */
    lpStartupInfo->hStdInput  = (HANDLE)0;
    lpStartupInfo->hStdOutput = (HANDLE)1;
    lpStartupInfo->hStdError  = (HANDLE)2;
}

/* Initialize whatever internal data structures we need.
 *
 * Returns 1 on success, 0 on failure.
 */
int KERN32_Init(void)
{
    /* Create the standard system handles
     */
    if(CreateStdHandles() != 0)
        return 0;

    return 1;
}

/* CreateStdHandles creates the standard input, output, and error handles.
 * These handles aren't likely to be used since they're generally used for
 * console output, but startup code still likes to mess with them.  They're
 * also useful for debugging since apps and runtime libraries might write
 * errors to stderr.
 *
 * Returns 0 on success, nonzero on failure.
 */
static int CreateStdHandles(void)
{
    /* Create the standard input handle.
     */
    hstdin = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
    if(hstdin == NULL)
        return 1;
    hstdin->common.magic = KERNEL_OBJECT_FILE;
    hstdin->fd = 0;
    hstdin->type = FILE_TYPE_CHAR;
    hstdin->misc_flags = 0;

    /* Create the standard output handle
     */
    hstdout = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
    if(hstdout == NULL)
        return 1;
    hstdout->common.magic = KERNEL_OBJECT_FILE;
    hstdout->fd = 1;
    hstdout->type = FILE_TYPE_CHAR;
    hstdout->misc_flags = 0;

    /* Create the standard error handle
     */
    hstderr = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
    if(hstderr == NULL)
        return 1;
    hstderr->common.magic = KERNEL_OBJECT_FILE;
    hstderr->fd = 2;
    hstderr->type = FILE_TYPE_CHAR;
    hstderr->misc_flags = 0;

    return 0;
}
