1/*
2 * Copyright (c) 2015-2019, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 *  * Redistributions of source code must retain the above copyright notice,
8 *    this list of conditions and the following disclaimer.
9 *  * Redistributions in binary form must reproduce the above copyright notice,
10 *    this list of conditions and the following disclaimer in the documentation
11 *    and/or other materials provided with the distribution.
12 *  * Neither the name of Intel Corporation nor the names of its contributors
13 *    may be used to endorse or promote products derived from this software
14 *    without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef PT_SECTION_WINDOWS_H
30#define PT_SECTION_WINDOWS_H
31
32#include <windows.h>
33#include <sys/types.h>
34#include <sys/stat.h>
35
36struct pt_section;
37
38
39/* Fstat-based file status. */
40struct pt_sec_windows_status {
41	/* The file status. */
42	struct _stat stat;
43};
44
45/* FileView-based section mapping information. */
46struct pt_sec_windows_mapping {
47	/* The file descriptor. */
48	int fd;
49
50	/* The FileMapping handle. */
51	HANDLE mh;
52
53	/* The mmap base address. */
54	uint8_t *base;
55
56	/* The begin and end of the mapped memory. */
57	const uint8_t *begin, *end;
58};
59
60
61/* Map a section.
62 *
63 * The caller has already opened the file for reading.
64 *
65 * On success, sets @section's mapping, unmap, and read pointers.
66 *
67 * Returns zero on success, a negative error code otherwise.
68 * Returns -pte_internal if @section is NULL.
69 * Returns -pte_invalid if @section can't be mapped.
70 */
71extern int pt_sec_windows_map(struct pt_section *section, int fd);
72
73/* Unmap a section.
74 *
75 * On success, clears @section's mapping, unmap, and read pointers.
76 *
77 * This function should not be called directly; call @section->unmap() instead.
78 *
79 * Returns zero on success, a negative error code otherwise.
80 * Returns -pte_internal if @section is NULL.
81 * Returns -pte_internal if @section has not been mapped.
82 */
83extern int pt_sec_windows_unmap(struct pt_section *section);
84
85/* Read memory from an mmaped section.
86 *
87 * Reads at most @size bytes from @section at @offset into @buffer.
88 *
89 * This function should not be called directly; call @section->read() instead.
90 *
91 * Returns the number of bytes read on success, a negative error code otherwise.
92 * Returns -pte_invalid if @section or @buffer are NULL.
93 * Returns -pte_nomap if @offset is beyond the end of the section.
94 */
95extern int pt_sec_windows_read(const struct pt_section *section,
96			       uint8_t *buffer, uint16_t size,
97			       uint64_t offset);
98
99/* Compute the memory size of a section.
100 *
101 * On success, provides the amount of memory used for mapping @section in bytes
102 * in @size.
103 *
104 * Returns zero on success, a negative error code otherwise.
105 * Returns -pte_internal if @section or @size is NULL.
106 * Returns -pte_internal if @section has not been mapped.
107 */
108extern int pt_sec_windows_memsize(const struct pt_section *section,
109				  uint64_t *size);
110
111#endif /* PT_SECTION_WINDOWS_H */
112