summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2026-07-14 00:54:14 +0200
committerladevieq <ladevie.quentin@gmail.com>2026-07-14 00:54:14 +0200
commit968d63f3eda7ba49fcba93e444788091cf3ccee8 (patch)
tree22d183400370116fd8d0412222f101eabecd0d89 /src
parent0f0ff9e1b91b64d2fe5d35a8f7f30f427905f66e (diff)
Fix the way we read the stream directory
Used to luckily find the stream block index at address - 1 Now we use the stream directory block list to read the directory block index
Diffstat (limited to 'src')
-rw-r--r--src/pdb.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/pdb.c b/src/pdb.c
index 23f69fa..15ee4cf 100644
--- a/src/pdb.c
+++ b/src/pdb.c
@@ -228,9 +228,15 @@ void open_pdb(const i8* pdb_path, struct module* module) {
assert(((i64)superblock.num_blocks) * superblock.block_size == file_size.QuadPart);
u8* block = alloca(superblock.block_size);
+ // Read directory block list
+ // NOTE: Stream directory bigger than a single block not managed
+ assert(superblock.num_directory_bytes < superblock.block_size);
+ u32 dir_block_index = 0U;
+ SetFilePointer(pdb_file, superblock.block_map_addr * superblock.block_size, NULL, FILE_BEGIN);
+ ReadFile(pdb_file, (void*)&dir_block_index, sizeof(dir_block_index), &b_read, NULL);
+
// Stream directory
- u32 dir_addr = (superblock.block_map_addr - 1U) * sizeof(block);
- SetFilePointer(pdb_file, dir_addr, NULL, FILE_BEGIN);
+ SetFilePointer(pdb_file, dir_block_index * superblock.block_size, NULL, FILE_BEGIN);
ReadFile(pdb_file, (void*)block, superblock.num_directory_bytes, &b_read, NULL);
assert(b_read == superblock.num_directory_bytes);
@@ -254,7 +260,7 @@ void open_pdb(const i8* pdb_path, struct module* module) {
}
stream_blocks_indices[stream_id] = &stream_blocks[block_index];
- for(u32 id = 0u; id < (stream_sizes[stream_id] / sizeof(block)) + 1U; id++) {
+ for(u32 id = 0u; id < (stream_sizes[stream_id] / superblock.block_size) + 1U; id++) {
print("PDB stream blocks : %u\n", stream_blocks[block_index]);
block_index++;
}
@@ -269,7 +275,7 @@ void open_pdb(const i8* pdb_path, struct module* module) {
};
struct pdb_info_stream pdb_info_stream = { 0U };
- SetFilePointer(pdb_file, stream_blocks_indices[PDB][0U] * sizeof(block), NULL, FILE_BEGIN);
+ SetFilePointer(pdb_file, stream_blocks_indices[PDB][0U] * superblock.block_size, NULL, FILE_BEGIN);
ReadFile(pdb_file, (void*)&pdb_info_stream, sizeof(pdb_info_stream), &b_read, NULL);
// DBI Stream
@@ -323,7 +329,7 @@ void open_pdb(const i8* pdb_path, struct module* module) {
u8* modules_name[64U] = { 0U };
u8* obj_files_name[64U] = { 0U };
u8 DBI_block[4096U] = { 0U };
- SetFilePointer(pdb_file, stream_blocks_indices[DBI][0U] * sizeof(block), NULL, FILE_BEGIN);
+ SetFilePointer(pdb_file, stream_blocks_indices[DBI][0U] * superblock.block_size, NULL, FILE_BEGIN);
ReadFile(pdb_file, (void*)&DBI_block, sizeof(DBI_block), &b_read, NULL);
struct DBI_stream_header* DBI_stream_header = (struct DBI_stream_header*)DBI_block;
@@ -421,12 +427,12 @@ void open_pdb(const i8* pdb_path, struct module* module) {
}
// Global Symbol Stream
- SetFilePointer(pdb_file, stream_blocks_indices[DBI_stream_header->global_stream_index][0U] * sizeof(block), NULL, FILE_BEGIN);
+ SetFilePointer(pdb_file, stream_blocks_indices[DBI_stream_header->global_stream_index][0U] * superblock.block_size, NULL, FILE_BEGIN);
ReadFile(pdb_file, (void*)&block, sizeof(DBI_stream_header), &b_read, NULL);
// Public Symbol Stream
- SetFilePointer(pdb_file, stream_blocks_indices[DBI_stream_header->public_stream_index][0U] * sizeof(block), NULL, FILE_BEGIN);
- ReadFile(pdb_file, (void*)&block, sizeof(block), &b_read, NULL);
+ SetFilePointer(pdb_file, stream_blocks_indices[DBI_stream_header->public_stream_index][0U] * superblock.block_size, NULL, FILE_BEGIN);
+ ReadFile(pdb_file, (void*)&block, superblock.block_size, &b_read, NULL);
CloseHandle(pdb_file);
}