// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace StatsViewer {
  /// <summary>
  /// Win32 API constants, structs, and wrappers for access via C#.
  /// </summary>
  class Win32 {
    #region Constants
    public enum MapAccess {
      FILE_MAP_COPY = 0x0001,
      FILE_MAP_WRITE = 0x0002,
      FILE_MAP_READ = 0x0004,
      FILE_MAP_ALL_ACCESS = 0x001f,
    }

    public const int GENERIC_READ = unchecked((int)0x80000000);
    public const int GENERIC_WRITE = unchecked((int)0x40000000);
    public const int OPEN_ALWAYS = 4;
    public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
    #endregion

    [DllImport("kernel32", SetLastError=true, CharSet=CharSet.Auto)]
    public static extern IntPtr CreateFile ( 
       String lpFileName, int dwDesiredAccess, int dwShareMode,
       IntPtr lpSecurityAttributes, int dwCreationDisposition,
       int dwFlagsAndAttributes, IntPtr hTemplateFile);

    [DllImport("kernel32", SetLastError=true)]
    public static extern IntPtr MapViewOfFile (
       IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh,
       int dwFileOffsetLow, int dwNumBytesToMap);

    [DllImport("kernel32", SetLastError=true, CharSet=CharSet.Auto)]
    public static extern IntPtr OpenFileMapping (
       int dwDesiredAccess, bool bInheritHandle, String lpName);

    [DllImport("kernel32", SetLastError=true)]
    public static extern bool UnmapViewOfFile (IntPtr lpBaseAddress);

    [DllImport("kernel32", SetLastError = true)]
    public static extern bool CloseHandle(IntPtr handle);
  }
}
