Author: rharabien
Date: Wed Jun 8 15:37:15 2011
New Revision: 52149
URL: http://svn.reactos.org/svn/reactos?rev=52149&view=rev
Log:
[WIN32K]
- Revert r51139. Fixes incorrect reading of all REG_MULTI_SZ values
See issue #6295 for more details.
Modified:
trunk/reactos/subsystems/win32/win32k/misc/registry.c
Modified: trunk/reactos/subsystems/win32/win32k/misc/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/mi…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/misc/registry.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/misc/registry.c [iso-8859-1] Wed Jun 8 15:37:15 2011
@@ -84,16 +84,14 @@
cbDataSize = cbInfoSize - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
+ /* Note: STATUS_BUFFER_OVERFLOW is not a success */
if (NT_SUCCESS(Status))
{
/* Did we get the right type */
if (pInfo->Type == ulType)
{
- /* Copy the contents to the caller. Make sure strings are null terminated */
- if (ulType == REG_SZ || ulType == REG_MULTI_SZ || ulType == REG_EXPAND_SZ)
- RtlStringCbCopyNW((LPWSTR)pvData, *pcbValue, (LPWSTR)pInfo->Data, cbDataSize);
- else
- RtlCopyMemory(pvData, pInfo->Data, cbDataSize);
+ /* Copy the contents to the caller */
+ RtlCopyMemory(pvData, pInfo->Data, cbDataSize);
}
else
Status = STATUS_OBJECT_TYPE_MISMATCH;
Author: tkreuzer
Date: Wed Jun 8 12:45:56 2011
New Revision: 52147
URL: http://svn.reactos.org/svn/reactos?rev=52147&view=rev
Log:
[FAT32]
Fix the "portable" version of the fat32 bootsector
Its now mostly identical to the one we currently use, only a few encoding differences
Modified:
trunk/reactos/boot/freeldr/bootsect/fat32.S
Modified: trunk/reactos/boot/freeldr/bootsect/fat32.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat3…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] Wed Jun 8 12:45:56 2011
@@ -10,6 +10,8 @@
#include <asm.inc>
+#define BP_REL(x) [bp+x-offset start]
+
.code16
//ORG HEX(7c00)
@@ -21,59 +23,59 @@
OEMName:
.ASCII "FrLdr1.0"
BytesPerSector:
- dw 512
+ .word 512
SectsPerCluster:
- db 0
+ .byte 0
ReservedSectors:
- dw 32
+ .word 32
NumberOfFats:
- db 2
+ .byte 2
MaxRootEntries:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
TotalSectors:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
MediaDescriptor:
- db HEX(0f8)
+ .byte HEX(0f8)
SectorsPerFat:
- dw 0 // Always zero for FAT32 volumes
+ .word 0 // Always zero for FAT32 volumes
SectorsPerTrack:
- dw 0
+ .word 0
NumberOfHeads:
- dw 0
+ .word 0
HiddenSectors:
- dd 0
+ .long 0
TotalSectorsBig:
- dd 0
+ .long 0
// FAT32 Inserted Info
SectorsPerFatBig:
- dd 0
+ .long 0
ExtendedFlags:
- dw 0
+ .word 0
FSVersion:
- dw 0
+ .word 0
RootDirStartCluster:
- dd 0
+ .long 0
FSInfoSector:
- dw 0
+ .word 0
BackupBootSector:
- dw 6
+ .word 6
Reserved1:
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// End FAT32 Inserted Info
BootDrive:
- db 0
+ .byte 0
Reserved:
- db 0
+ .byte 0
ExtendSig:
- db HEX(29)
+ .byte HEX(29)
SerialNumber:
- dd 0
+ .long 0
VolumeLabel:
- db "NO NAME "
+ .ascii "NO NAME "
FileSystem:
- db "FAT32 "
+ .ascii "FAT32 "
main:
xor ax,ax // Setup segment registers
@@ -83,27 +85,27 @@
mov bp, HEX(7c00)
mov sp, HEX(7c00) // Setup a stack
- cmp byte ptr ds:[BootDrive], HEX(0ff) // If they have specified a boot drive then use it
+ cmp byte ptr BP_REL(BootDrive), HEX(0ff) // If they have specified a boot drive then use it
jne CheckSectorsPerFat
- mov byte ptr ds:[BootDrive], dl // Save the boot drive
+ mov byte ptr BP_REL(BootDrive), dl // Save the boot drive
CheckSectorsPerFat:
- cmp word ptr [SectorsPerFat], 0 // Check the old 16-bit value of SectorsPerFat
+ cmp word ptr BP_REL(SectorsPerFat), 0 // Check the old 16-bit value of SectorsPerFat
jnz CheckFailed // If it is non-zero then exit with an error
CheckTotalSectors: // Check the old 16-bit value of TotalSectors & MaxRootEntries
- cmp word ptr [MaxRootEntries], 0// by comparing the DWORD at offset MaxRootEntries to zero
+ cmp dword ptr BP_REL(MaxRootEntries), 0// by comparing the DWORD at offset MaxRootEntries to zero
jnz CheckFailed // If it is non-zero then exit with an error
CheckFileSystemVersion:
- cmp word ptr [FSVersion], 0 // Check the file system version word
+ cmp word ptr BP_REL(FSVersion), 0 // Check the file system version word
jna GetDriveParameters // It is zero, so continue
CheckFailed:
jmp PrintFileSystemError // If it is not zero then exit with an error
GetDriveParameters:
mov ax, HEX(0800)
- mov dl, byte ptr [BootDrive] // Get boot drive in dl
+ mov dl, byte ptr BP_REL(BootDrive) // Get boot drive in dl
int HEX(13) // Request drive parameters from the bios
jnc CalcDriveSize // If the call succeeded then calculate the drive size
@@ -137,7 +139,7 @@
// First we have to load our extra boot code at
// sector 14 into memory at [0000:7e00h]
mov eax, HEX(0e)
- add eax, dword ptr ds:[HiddenSectors] // Add the number of hidden sectors
+ add eax, dword ptr BP_REL(HiddenSectors) // Add the number of hidden sectors
mov cx, 1
xor bx, bx
mov es, bx // Read sector to [0000:7e00h]
@@ -160,7 +162,7 @@
CheckInt13hExtensions: // Now check if this computer supports extended reads
mov ah, HEX(41) // AH = 41h
mov bx, HEX(55aa) // BX = 55AAh
- mov dl, byte ptr ds:[BootDrive] // DL = drive (80h-FFh)
+ mov dl, byte ptr BP_REL(BootDrive) // DL = drive (80h-FFh)
int HEX(13) // IBM/MS INT 13 Extensions - INSTALLATION CHECK
jc ReadSectorsCHS // CF set on error (extensions not supported)
cmp bx, HEX(0aa55) // BX = AA55h if installed
@@ -179,7 +181,7 @@
ReadSectorsSetupDiskAddressPacket:
mov word ptr ds:[LBASectorsRead],cx
- push 0
+ push 0 // push large 0 ?
push eax // Put 64-bit logical block address on stack
push es // Put transfer segment on stack
push bx // Put transfer offset on stack
@@ -187,7 +189,7 @@
push 16 // Set size of packet to 10h
mov si, sp // Setup disk address packet on stack
- mov dl, byte ptr ds:[BootDrive] // Drive number
+ mov dl, byte ptr BP_REL(BootDrive) // Drive number
mov ah, HEX(42) // Int 13h, AH = 42h - Extended Read
int HEX(13) // Call BIOS
jc PrintDiskError // If the read failed then abort
@@ -211,7 +213,7 @@
ret
LBASectorsRead:
- dd 0
+ .long 0
// Reads logical sectors into [ES:BX]
@@ -223,15 +225,15 @@
ReadSectorsCHSLoop:
pushad
xor edx, edx
- movzx ecx, word ptr ds:[SectorsPerTrack]
+ movzx ecx, word ptr BP_REL(SectorsPerTrack)
div ecx // Divide logical by SectorsPerTrack
inc dl // Sectors numbering starts at 1 not 0
mov cl, dl // Sector in CL
mov edx, eax
shr edx, 16
- div word ptr ds:[NumberOfHeads] // Divide logical by number of heads
+ div word ptr BP_REL(NumberOfHeads) // Divide logical by number of heads
mov dh, dl // Head in DH
- mov dl, byte ptr ds:[BootDrive] // Drive number in DL
+ mov dl, byte ptr BP_REL(BootDrive) // Drive number in DL
mov ch, al // Cylinder in CX
ror ah, 1 // Low 8 bits of cylinder in CH, high 2 bits
ror ah, 1 // in CL shifted to bits 6 & 7
@@ -267,7 +269,7 @@
// Displays a file system error message
// And reboots
PrintFileSystemError:
- mov si,msgFileSystemError // FreeLdr not found message
+ mov si, offset msgFileSystemError // FreeLdr not found message
call PutChars // Display it
Reboot:
@@ -286,27 +288,26 @@
int HEX(10)
jmp short PutChars
Done:
- retn
+ ret
BiosCHSDriveSize:
- dd 0
+ .long 0
msgDiskError:
- db "Disk error", 13, 10, 0
+ .asciz "Disk error\r\n"
msgFileSystemError:
- db "File system error", 13, 10, 0
+ .asciz "File system error\r\n"
msgAnyKey:
- db "Press any key to restart", 13, 10, 0
-
-// times 509-($-$$) db 0 // Pad to 509 bytes
+ .asciz "Press any key to restart\r\n"
+
.org 509 // Pad to 509 bytes
BootPartition:
- db 0
+ .byte 0
BootSignature:
- dw 0aa55h // BootSector signature
+ .word HEX(0aa55) // BootSector signature
// End of bootsector
//
@@ -323,7 +324,7 @@
StartSearch:
// Now we must get the first cluster of the root directory
- mov eax, dword ptr ds:[RootDirStartCluster]
+ mov eax, dword ptr BP_REL(RootDirStartCluster)
cmp eax, HEX(0ffffff8) // Check to see if this is the last cluster in the chain
jb ContinueSearch // If not continue, if so then we didn't find freeldr.sys
jmp PrintFileNotFound
@@ -336,7 +337,7 @@
// Now we have to find our way through the root directory to
// The OSLOADER.SYS file
xor bx,bx
- mov bl, byte ptr ds:[SectsPerCluster]
+ mov bl, byte ptr BP_REL(SectsPerCluster)
shl bx, 4 // BX = BX * 512 / 32
mov ax, HEX(2000) // We loaded at 2000:0000
mov es, ax
@@ -362,9 +363,9 @@
jnz FindFile // Last entry?
// Get the next root dir cluster and try again until we run out of clusters
- mov eax, dword ptr ds:[RootDirStartCluster]
+ mov eax, dword ptr BP_REL(RootDirStartCluster)
call GetFatEntry
- mov dword ptr ds:[RootDirStartCluster], eax
+ mov dword ptr BP_REL(RootDirStartCluster), eax
jmp StartSearch
FoundFile:
@@ -374,9 +375,9 @@
xor di, di // ES:DI has dir entry
xor dx, dx
- mov ax, word ptr es:[di+14h] // Get start cluster high word
+ mov ax, word ptr es:[di+20] // Get start cluster high word
shl eax, 16
- mov ax, word ptr es:[di+1ah] // Get start cluster low word
+ mov ax, word ptr es:[di+26] // Get start cluster low word
CheckStartCluster:
cmp eax, 2 // Check and see if the start cluster starts at cluster 2 or above
@@ -401,7 +402,7 @@
pop es
xor bx, bx
- mov bl, byte ptr ds:[SectsPerCluster]
+ mov bl, byte ptr BP_REL(SectsPerCluster)
shl bx, 5 // BX = BX * 512 / 16
mov ax, es // Increment the load address by
add ax, bx // The size of a cluster
@@ -415,7 +416,7 @@
jmp LoadFile // Load the next cluster (if any)
LoadFileDone:
- mov dl, byte ptr ds:[BootDrive] // Load boot drive into DL
+ mov dl, byte ptr BP_REL(BootDrive) // Load boot drive into DL
mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
push 0 // push segment (0x0000)
@@ -432,12 +433,12 @@
shl eax, 2 // EAX = EAX * 4 (since FAT32 entries are 4 bytes)
mov ecx, eax // Save this for later in ECX
xor edx, edx
- movzx ebx, word ptr ds:[BytesPerSector]
+ movzx ebx, word ptr BP_REL(BytesPerSector)
push ebx
div ebx // FAT Sector Number = EAX / BytesPerSector
- movzx ebx, word ptr ds:[ReservedSectors]
+ movzx ebx, word ptr BP_REL(ReservedSectors)
add eax, ebx // FAT Sector Number += ReservedSectors
- mov ebx, dword ptr ds:[HiddenSectors]
+ mov ebx, dword ptr BP_REL(HiddenSectors)
add eax, ebx // FAT Sector Number += HiddenSectors
pop ebx
dec ebx
@@ -449,15 +450,15 @@
// to see which FAT is the active one
// and use it, or if they are mirrored then
// no worries
- movzx ebx, word ptr ds:[ExtendedFlags] // Get extended flags and put into ebx
+ movzx ebx, word ptr BP_REL(ExtendedFlags) // Get extended flags and put into ebx
and bx, HEX(0f) // Mask off upper 8 bits, now we have active fat in bl
jz LoadFatSector // If fat is mirrored then skip fat calcs
- cmp bl, byte ptr ds:[NumberOfFats] // Compare bl to number of fats
+ cmp bl, byte ptr BP_REL(NumberOfFats) // Compare bl to number of fats
jb GetActiveFatOffset
jmp PrintFileSystemError // If bl is bigger than numfats exit with error
GetActiveFatOffset:
push eax // Save logical FAT sector number
- mov eax, dword ptr ds:[SectorsPerFatBig] // Get the number of sectors occupied by one fat in eax
+ mov eax, dword ptr BP_REL(SectorsPerFatBig) // Get the number of sectors occupied by one fat in eax
mul ebx // Multiplied by the active FAT index we have in ebx
pop edx // Get logical FAT sector number
add eax, edx // Add the current FAT sector offset
@@ -486,7 +487,7 @@
ret
FatSectorInCache: // This variable tells us which sector we currently have in memory
- dd 0ffffffffh // There is no need to re-read the same sector if we don't have to
+ .long HEX(0ffffffff) // There is no need to re-read the same sector if we don't have to
// Reads cluster number in EAX into [ES:0000]
@@ -496,19 +497,19 @@
dec eax
dec eax
xor edx, edx
- movzx ebx, byte ptr ds:[SectsPerCluster]
+ movzx ebx, byte ptr BP_REL(SectsPerCluster)
mul ebx
push eax
xor edx, edx
- movzx eax, byte ptr ds:[NumberOfFats]
- mul dword ptr ds:[SectorsPerFatBig]
- movzx ebx, word ptr ds:[ReservedSectors]
+ movzx eax, byte ptr BP_REL(NumberOfFats)
+ mul dword ptr BP_REL(SectorsPerFatBig)
+ movzx ebx, word ptr BP_REL(ReservedSectors)
add eax, ebx
- add eax, dword ptr ds:[HiddenSectors]
+ add eax, dword ptr BP_REL(HiddenSectors)
pop ebx
add eax, ebx // EAX now contains the logical sector number of the cluster
xor bx, bx // We will load it to [ES:0000], ES loaded before function call
- movzx cx, byte ptr ds:[SectsPerCluster]
+ movzx cx, byte ptr BP_REL(SectsPerCluster)
call ReadSectors
ret
@@ -523,15 +524,15 @@
jmp Reboot
msgFreeLdr:
- db "freeldr.sys not found", 13, 10, 0
+ .asciz "freeldr.sys not found\r\n"
filename:
- db "FREELDR SYS"
+ .ascii "FREELDR SYS"
msgLoading:
- db "Loading FreeLoader...", 13, 10, 0
-
- //times 1022-($-$$) db 0 // Pad to 1022 bytes
-
- dw 0aa55h // BootSector signature
+ .asciz "Loading FreeLoader...\r\n"
+
+.org 1022 // Pad to 1022 bytes
+
+ .word HEX(0aa55) // BootSector signature
.endcode16
Author: tkreuzer
Date: Tue Jun 7 23:22:38 2011
New Revision: 52143
URL: http://svn.reactos.org/svn/reactos?rev=52143&view=rev
Log:
[CMAKE]
- Export obj2bin on MSVC builds
- Move CreateBootSectorTarget into compiler specific files
- Add _base_address parameter to CreateBootSectorTarget (neccessary for obj2bin)
- Implement CreateBootSectorTarget for msvc
- Add ML compatible fat32 bootsector (untested)
Added:
trunk/reactos/boot/freeldr/bootsect/fat32.S (with props)
Modified:
trunk/reactos/CMakeLists.txt
trunk/reactos/CMakeMacros.cmake
trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
trunk/reactos/gcc.cmake
trunk/reactos/msc.cmake
Modified: trunk/reactos/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/CMakeLists.txt?rev=52143&r…
==============================================================================
--- trunk/reactos/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/CMakeLists.txt [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -61,7 +61,7 @@
if(NOT MSVC)
export(TARGETS widl wrc gendib cabman cdmake mkhive spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
else()
- export(TARGETS gendib cabman cdmake mkhive spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
+ export(TARGETS gendib cabman cdmake mkhive obj2bin spec2def geninc FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- )
endif()
else()
@@ -72,7 +72,7 @@
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
-
+
#useful stuff!
include(CMakeParseArguments)
Modified: trunk/reactos/CMakeMacros.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/CMakeMacros.cmake?rev=5214…
==============================================================================
--- trunk/reactos/CMakeMacros.cmake [iso-8859-1] (original)
+++ trunk/reactos/CMakeMacros.cmake [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -1,35 +1,3 @@
-
-if (NOT MSVC)
-
-macro(CreateBootSectorTarget _target_name _asm_file _object_file)
- get_filename_component(OBJECT_PATH ${_object_file} PATH)
- get_filename_component(OBJECT_NAME ${_object_file} NAME)
- file(MAKE_DIRECTORY ${OBJECT_PATH})
- get_directory_property(defines COMPILE_DEFINITIONS)
- get_directory_property(includes INCLUDE_DIRECTORIES)
-
- foreach(arg ${defines})
- set(result_defs ${result_defs} -D${arg})
- endforeach()
-
- foreach(arg ${includes})
- set(result_incs -I${arg} ${result_incs})
- endforeach()
-
- add_custom_command(
- OUTPUT ${_object_file}
- COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file}
- DEPENDS ${_asm_file})
- set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE)
- add_custom_target(${_target_name} ALL DEPENDS ${_object_file})
-endmacro()
-
-else()
-
-macro(CreateBootSectorTarget _target_name _asm_file _object_file)
-endmacro()
-
-endif()
macro(set_cpp)
include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
@@ -108,27 +76,27 @@
if(NOT (_CD_TARGET OR _CD_FILE))
message(FATAL_ERROR "You must provide a target or a file to install!")
endif()
-
+
if(NOT _CD_DESTINATION)
message(FATAL_ERROR "You must provide a destination")
elseif(${_CD_DESTINATION} STREQUAL root)
set(_CD_DESTINATION "")
endif()
-
+
if(NOT _CD_FOR)
message(FATAL_ERROR "You must provide a cd name (or "all" for all of them) to install the file on!")
endif()
-
+
#get file if we need to
if(NOT _CD_FILE)
get_target_property(_CD_FILE ${_CD_TARGET} LOCATION)
endif()
-
+
#do we add it to all CDs?
if(_CD_FOR STREQUAL all)
set(_CD_FOR "bootcd;livecd;regtest")
endif()
-
+
#do we add it to bootcd?
list(FIND _CD_FOR bootcd __cd)
if(NOT __cd EQUAL -1)
@@ -161,7 +129,7 @@
endif()
endif()
endif() #end bootcd
-
+
#do we add it to livecd?
list(FIND _CD_FOR livecd __cd)
if(NOT __cd EQUAL -1)
@@ -178,7 +146,7 @@
file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
endif() #end livecd
-
+
#do we add it to regtest?
list(FIND _CD_FOR regtest __cd)
if(NOT __cd EQUAL -1)
Modified: trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/CMak…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/bootsect/CMakeLists.txt [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -1,14 +1,19 @@
-CreateBootSectorTarget(dosmbr ${CMAKE_CURRENT_SOURCE_DIR}/dosmbr.asm ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin)
-CreateBootSectorTarget(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.asm ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin)
-CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.asm ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin)
-CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.asm ${CMAKE_CURRENT_BINARY_DIR}/fat.bin)
-CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.asm ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin)
-CreateBootSectorTarget(isobtrt ${CMAKE_CURRENT_SOURCE_DIR}/isobtrt.asm ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin)
+if(MSVC)
+CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.S ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 7c00)
+else()
+CreateBootSectorTarget(dosmbr ${CMAKE_CURRENT_SOURCE_DIR}/dosmbr.asm ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin 0)
+CreateBootSectorTarget(ext2 ${CMAKE_CURRENT_SOURCE_DIR}/ext2.asm ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin 0)
+CreateBootSectorTarget(fat32 ${CMAKE_CURRENT_SOURCE_DIR}/fat32.asm ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin 0)
+CreateBootSectorTarget(fat ${CMAKE_CURRENT_SOURCE_DIR}/fat.asm ${CMAKE_CURRENT_BINARY_DIR}/fat.bin 0)
+CreateBootSectorTarget(isoboot ${CMAKE_CURRENT_SOURCE_DIR}/isoboot.asm ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin 0)
+CreateBootSectorTarget(isobtrt ${CMAKE_CURRENT_SOURCE_DIR}/isobtrt.asm ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin 0)
+endif()
add_cd_file(TARGET dosmbr DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/dosmbr.bin FOR all)
add_cd_file(TARGET ext2 DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/ext2.bin FOR all)
add_cd_file(TARGET fat32 DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/fat32.bin FOR all)
add_cd_file(TARGET fat DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/fat.bin FOR all)
add_cd_file(TARGET isoboot DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isoboot.bin FOR all)
-add_cd_file(TARGET isobtrt DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin FOR all)
+add_cd_file(TARGET isobtrt DESTINATION loader NO_CAB FILE ${CMAKE_CURRENT_BINARY_DIR}/isobtrt.bin FOR all)
+
Added: trunk/reactos/boot/freeldr/bootsect/fat32.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/bootsect/fat3…
==============================================================================
--- trunk/reactos/boot/freeldr/bootsect/fat32.S (added)
+++ trunk/reactos/boot/freeldr/bootsect/fat32.S [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -1,0 +1,538 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Bootsector
+ * FILE:
+ * PURPOSE:
+ * PROGRAMMERS: ?
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <asm.inc>
+
+.code16
+
+//ORG HEX(7c00)
+
+start:
+ jmp short main
+ nop
+
+OEMName:
+ .ASCII "FrLdr1.0"
+BytesPerSector:
+ dw 512
+SectsPerCluster:
+ db 0
+ReservedSectors:
+ dw 32
+NumberOfFats:
+ db 2
+MaxRootEntries:
+ dw 0 // Always zero for FAT32 volumes
+TotalSectors:
+ dw 0 // Always zero for FAT32 volumes
+MediaDescriptor:
+ db HEX(0f8)
+SectorsPerFat:
+ dw 0 // Always zero for FAT32 volumes
+SectorsPerTrack:
+ dw 0
+NumberOfHeads:
+ dw 0
+HiddenSectors:
+ dd 0
+TotalSectorsBig:
+ dd 0
+
+// FAT32 Inserted Info
+SectorsPerFatBig:
+ dd 0
+ExtendedFlags:
+ dw 0
+FSVersion:
+ dw 0
+RootDirStartCluster:
+ dd 0
+FSInfoSector:
+ dw 0
+BackupBootSector:
+ dw 6
+Reserved1:
+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+// End FAT32 Inserted Info
+BootDrive:
+ db 0
+Reserved:
+ db 0
+ExtendSig:
+ db HEX(29)
+SerialNumber:
+ dd 0
+VolumeLabel:
+ db "NO NAME "
+FileSystem:
+ db "FAT32 "
+
+main:
+ xor ax,ax // Setup segment registers
+ mov ds,ax // Make DS correct
+ mov es,ax // Make ES correct
+ mov ss,ax // Make SS correct
+ mov bp, HEX(7c00)
+ mov sp, HEX(7c00) // Setup a stack
+
+ cmp byte ptr ds:[BootDrive], HEX(0ff) // If they have specified a boot drive then use it
+ jne CheckSectorsPerFat
+
+ mov byte ptr ds:[BootDrive], dl // Save the boot drive
+
+CheckSectorsPerFat:
+
+ cmp word ptr [SectorsPerFat], 0 // Check the old 16-bit value of SectorsPerFat
+ jnz CheckFailed // If it is non-zero then exit with an error
+CheckTotalSectors: // Check the old 16-bit value of TotalSectors & MaxRootEntries
+ cmp word ptr [MaxRootEntries], 0// by comparing the DWORD at offset MaxRootEntries to zero
+ jnz CheckFailed // If it is non-zero then exit with an error
+CheckFileSystemVersion:
+ cmp word ptr [FSVersion], 0 // Check the file system version word
+ jna GetDriveParameters // It is zero, so continue
+CheckFailed:
+ jmp PrintFileSystemError // If it is not zero then exit with an error
+
+GetDriveParameters:
+ mov ax, HEX(0800)
+ mov dl, byte ptr [BootDrive] // Get boot drive in dl
+ int HEX(13) // Request drive parameters from the bios
+ jnc CalcDriveSize // If the call succeeded then calculate the drive size
+
+ // If we get here then the call to the BIOS failed
+ // so just set CHS equal to the maximum addressable
+ // size
+ mov cx, HEX(0ffff)
+ mov dh, cl
+
+CalcDriveSize:
+ // Now that we have the drive geometry
+ // lets calculate the drive size
+ mov bl, ch // Put the low 8-bits of the cylinder count into BL
+ mov bh, cl // Put the high 2-bits in BH
+ shr bh, 6 // Shift them into position, now BX contains the cylinder count
+ and cl, HEX(3f) // Mask off cylinder bits from sector count
+ // CL now contains sectors per track and DH contains head count
+ movzx eax, dh // Move the heads into EAX
+ movzx ebx, bx // Move the cylinders into EBX
+ movzx ecx, cl // Move the sectors per track into ECX
+ inc eax // Make it one based because the bios returns it zero based
+ inc ebx // Make the cylinder count one based also
+ mul ecx // Multiply heads with the sectors per track, result in edx:eax
+ mul ebx // Multiply the cylinders with (heads * sectors) [stored in edx:eax already]
+
+ // We now have the total number of sectors as reported
+ // by the bios in eax, so store it in our variable
+ mov dword ptr ds:[BiosCHSDriveSize], eax
+
+LoadExtraBootCode:
+ // First we have to load our extra boot code at
+ // sector 14 into memory at [0000:7e00h]
+ mov eax, HEX(0e)
+ add eax, dword ptr ds:[HiddenSectors] // Add the number of hidden sectors
+ mov cx, 1
+ xor bx, bx
+ mov es, bx // Read sector to [0000:7e00h]
+ mov bx, HEX(7e00)
+ call ReadSectors
+ jmp StartSearch
+
+
+// Reads logical sectors into [ES:BX]
+// EAX has logical sector number to read
+// CX has number of sectors to read
+ReadSectors:
+ cmp eax, dword ptr ds:[BiosCHSDriveSize] // Check if they are reading a sector outside CHS range
+ jae ReadSectorsLBA // Yes - go to the LBA routine
+ // If at all possible we want to use LBA routines because
+ // They are optimized to read more than 1 sector per read
+
+ pushad // Save logical sector number & sector count
+
+CheckInt13hExtensions: // Now check if this computer supports extended reads
+ mov ah, HEX(41) // AH = 41h
+ mov bx, HEX(55aa) // BX = 55AAh
+ mov dl, byte ptr ds:[BootDrive] // DL = drive (80h-FFh)
+ int HEX(13) // IBM/MS INT 13 Extensions - INSTALLATION CHECK
+ jc ReadSectorsCHS // CF set on error (extensions not supported)
+ cmp bx, HEX(0aa55) // BX = AA55h if installed
+ jne ReadSectorsCHS
+ test cl,1 // CX = API subset support bitmap
+ jz ReadSectorsCHS // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
+
+ popad // Restore sector count & logical sector number
+
+ReadSectorsLBA:
+ pushad // Save logical sector number & sector count
+
+ cmp cx, 64 // Since the LBA calls only support 0x7F sectors at a time we will limit ourselves to 64
+ jbe ReadSectorsSetupDiskAddressPacket // If we are reading less than 65 sectors then just do the read
+ mov cx, 64 // Otherwise read only 64 sectors on this loop iteration
+
+ReadSectorsSetupDiskAddressPacket:
+ mov word ptr ds:[LBASectorsRead],cx
+ push 0
+ push eax // Put 64-bit logical block address on stack
+ push es // Put transfer segment on stack
+ push bx // Put transfer offset on stack
+ push cx // Set transfer count
+ push 16 // Set size of packet to 10h
+ mov si, sp // Setup disk address packet on stack
+
+ mov dl, byte ptr ds:[BootDrive] // Drive number
+ mov ah, HEX(42) // Int 13h, AH = 42h - Extended Read
+ int HEX(13) // Call BIOS
+ jc PrintDiskError // If the read failed then abort
+
+ add sp, 16 // Remove disk address packet from stack
+
+ popad // Restore sector count & logical sector number
+
+ push bx
+ mov ebx, dword ptr ds:[LBASectorsRead]
+ add eax, ebx // Increment sector to read
+ shl ebx, 5
+ mov dx, es
+ add dx, bx // Setup read buffer for next sector
+ mov es, dx
+ pop bx
+
+ sub cx, word ptr ds:[LBASectorsRead]
+ jnz ReadSectorsLBA // Read next sector
+
+ ret
+
+LBASectorsRead:
+ dd 0
+
+
+// Reads logical sectors into [ES:BX]
+// EAX has logical sector number to read
+// CX has number of sectors to read
+ReadSectorsCHS:
+ popad // Get logical sector number & sector count off stack
+
+ReadSectorsCHSLoop:
+ pushad
+ xor edx, edx
+ movzx ecx, word ptr ds:[SectorsPerTrack]
+ div ecx // Divide logical by SectorsPerTrack
+ inc dl // Sectors numbering starts at 1 not 0
+ mov cl, dl // Sector in CL
+ mov edx, eax
+ shr edx, 16
+ div word ptr ds:[NumberOfHeads] // Divide logical by number of heads
+ mov dh, dl // Head in DH
+ mov dl, byte ptr ds:[BootDrive] // Drive number in DL
+ mov ch, al // Cylinder in CX
+ ror ah, 1 // Low 8 bits of cylinder in CH, high 2 bits
+ ror ah, 1 // in CL shifted to bits 6 & 7
+ or cl, ah // Or with sector number
+ mov ax, HEX(0201)
+ int HEX(13) // DISK - READ SECTORS INTO MEMORY
+ // AL = number of sectors to read, CH = track, CL = sector
+ // DH = head, DL = drive, ES:BX -> buffer to fill
+ // Return: CF set on error, AH = status (see AH=01h), AL = number of sectors read
+
+ jc PrintDiskError // If the read failed then abort
+
+ popad
+
+ inc eax // Increment Sector to Read
+
+ mov dx, es
+ add dx, 32 // Increment read buffer for next sector
+ mov es, dx
+
+ loop ReadSectorsCHSLoop // Read next sector
+
+ ret
+
+// Displays a disk error message
+// And reboots
+PrintDiskError:
+ mov si, offset msgDiskError // Bad boot disk message
+ call PutChars // Display it
+
+ jmp Reboot
+
+// Displays a file system error message
+// And reboots
+PrintFileSystemError:
+ mov si,msgFileSystemError // FreeLdr not found message
+ call PutChars // Display it
+
+Reboot:
+ mov si, offset msgAnyKey // Press any key message
+ call PutChars // Display it
+ xor ax, ax
+ int HEX(16) // Wait for a keypress
+ int HEX(19) // Reboot
+
+PutChars:
+ lodsb
+ or al, al
+ jz short Done
+ mov ah, HEX(0e)
+ mov bx, 7
+ int HEX(10)
+ jmp short PutChars
+Done:
+ retn
+
+
+BiosCHSDriveSize:
+ dd 0
+
+msgDiskError:
+ db "Disk error", 13, 10, 0
+msgFileSystemError:
+ db "File system error", 13, 10, 0
+msgAnyKey:
+ db "Press any key to restart", 13, 10, 0
+
+// times 509-($-$$) db 0 // Pad to 509 bytes
+.org 509 // Pad to 509 bytes
+
+BootPartition:
+ db 0
+
+BootSignature:
+ dw 0aa55h // BootSector signature
+
+// End of bootsector
+//
+// Now starts the extra boot code that we will store
+// at sector 14 on a FAT32 volume
+//
+// To remain multi-boot compatible with other operating
+// systems we must not overwrite anything other than
+// the bootsector which means we will have to use
+// a different sector like 14 to store our extra boot code
+
+
+
+StartSearch:
+
+ // Now we must get the first cluster of the root directory
+ mov eax, dword ptr ds:[RootDirStartCluster]
+ cmp eax, HEX(0ffffff8) // Check to see if this is the last cluster in the chain
+ jb ContinueSearch // If not continue, if so then we didn't find freeldr.sys
+ jmp PrintFileNotFound
+
+ContinueSearch:
+ mov bx, HEX(2000)
+ mov es, bx // Read cluster to [2000:0000h]
+ call ReadCluster // Read the cluster
+
+ // Now we have to find our way through the root directory to
+ // The OSLOADER.SYS file
+ xor bx,bx
+ mov bl, byte ptr ds:[SectsPerCluster]
+ shl bx, 4 // BX = BX * 512 / 32
+ mov ax, HEX(2000) // We loaded at 2000:0000
+ mov es, ax
+ xor di, di
+ mov si, offset filename
+ mov cx, 11
+ repe cmpsb // Compare filenames
+ jz FoundFile // If same we found it
+ dec bx
+ jnz FindFile
+ jmp PrintFileNotFound
+
+FindFile:
+ mov ax, es // We didn't find it in the previous dir entry
+ add ax, 2 // So lets move to the next one
+ mov es, ax // And search again
+ xor di, di
+ mov si, offset filename
+ mov cx, 11
+ repe cmpsb // Compare filenames
+ jz FoundFile // If same we found it
+ dec bx // Keep searching till we run out of dir entries
+ jnz FindFile // Last entry?
+
+ // Get the next root dir cluster and try again until we run out of clusters
+ mov eax, dword ptr ds:[RootDirStartCluster]
+ call GetFatEntry
+ mov dword ptr ds:[RootDirStartCluster], eax
+ jmp StartSearch
+
+FoundFile:
+ // Display "Loading FreeLoader..." message
+ mov si, offset msgLoading // Loading message
+ call PutChars // Display it
+
+ xor di, di // ES:DI has dir entry
+ xor dx, dx
+ mov ax, word ptr es:[di+14h] // Get start cluster high word
+ shl eax, 16
+ mov ax, word ptr es:[di+1ah] // Get start cluster low word
+
+CheckStartCluster:
+ cmp eax, 2 // Check and see if the start cluster starts at cluster 2 or above
+ jnb CheckEndCluster // If so then continue
+ jmp PrintFileSystemError // If not exit with error
+CheckEndCluster:
+ cmp eax, HEX(0ffffff8) // Check and see if the start cluster is and end of cluster chain indicator
+ jb InitializeLoadSegment // If not then continue
+ jmp PrintFileSystemError // If so exit with error
+
+InitializeLoadSegment:
+ mov bx, HEX(800)
+ mov es, bx
+
+LoadFile:
+ cmp eax, HEX(0ffffff8) // Check to see if this is the last cluster in the chain
+ jae LoadFileDone // If so continue, if not then read the next one
+ push eax
+ xor bx, bx // Load ROSLDR starting at 0000:8000h
+ push es
+ call ReadCluster
+ pop es
+
+ xor bx, bx
+ mov bl, byte ptr ds:[SectsPerCluster]
+ shl bx, 5 // BX = BX * 512 / 16
+ mov ax, es // Increment the load address by
+ add ax, bx // The size of a cluster
+ mov es, ax
+
+ pop eax
+ push es
+ call GetFatEntry // Get the next entry
+ pop es
+
+ jmp LoadFile // Load the next cluster (if any)
+
+LoadFileDone:
+ mov dl, byte ptr ds:[BootDrive] // Load boot drive into DL
+ mov dh, byte ptr ds:[BootPartition] // Load boot partition into DH
+
+ push 0 // push segment (0x0000)
+ mov eax, dword ptr ds:[HEX(8000) + HEX(0A8)] // load the RVA of the EntryPoint into eax
+ add eax, HEX(8000) // RVA -> VA
+ push ax // push offset
+ retf // Transfer control to FreeLoader
+
+// Returns the FAT entry for a given cluster number
+// On entry EAX has cluster number
+// On return EAX has FAT entry for that cluster
+GetFatEntry:
+
+ shl eax, 2 // EAX = EAX * 4 (since FAT32 entries are 4 bytes)
+ mov ecx, eax // Save this for later in ECX
+ xor edx, edx
+ movzx ebx, word ptr ds:[BytesPerSector]
+ push ebx
+ div ebx // FAT Sector Number = EAX / BytesPerSector
+ movzx ebx, word ptr ds:[ReservedSectors]
+ add eax, ebx // FAT Sector Number += ReservedSectors
+ mov ebx, dword ptr ds:[HiddenSectors]
+ add eax, ebx // FAT Sector Number += HiddenSectors
+ pop ebx
+ dec ebx
+ and ecx,ebx // FAT Offset Within Sector = ECX % BytesPerSector
+ // EAX holds logical FAT sector number
+ // ECX holds FAT entry offset
+
+ // Now we have to check the extended flags
+ // to see which FAT is the active one
+ // and use it, or if they are mirrored then
+ // no worries
+ movzx ebx, word ptr ds:[ExtendedFlags] // Get extended flags and put into ebx
+ and bx, HEX(0f) // Mask off upper 8 bits, now we have active fat in bl
+ jz LoadFatSector // If fat is mirrored then skip fat calcs
+ cmp bl, byte ptr ds:[NumberOfFats] // Compare bl to number of fats
+ jb GetActiveFatOffset
+ jmp PrintFileSystemError // If bl is bigger than numfats exit with error
+GetActiveFatOffset:
+ push eax // Save logical FAT sector number
+ mov eax, dword ptr ds:[SectorsPerFatBig] // Get the number of sectors occupied by one fat in eax
+ mul ebx // Multiplied by the active FAT index we have in ebx
+ pop edx // Get logical FAT sector number
+ add eax, edx // Add the current FAT sector offset
+
+LoadFatSector:
+ push ecx
+ // EAX holds logical FAT sector number
+ // Check if we have already loaded it
+ cmp eax, dword ptr ds:[FatSectorInCache]
+ je LoadFatSectorAlreadyLoaded
+
+ mov dword ptr ds:[FatSectorInCache], eax
+ mov bx, HEX(7000)
+ mov es, bx
+ xor bx, bx // We will load it to [7000:0000h]
+ mov cx, 1
+ call ReadSectors
+
+LoadFatSectorAlreadyLoaded:
+ mov bx, HEX(7000)
+ mov es, bx
+ pop ecx
+ mov eax, dword ptr es:[ecx] // Get FAT entry
+ and eax, HEX(0fffffff) // Mask off reserved bits
+
+ ret
+
+FatSectorInCache: // This variable tells us which sector we currently have in memory
+ dd 0ffffffffh // There is no need to re-read the same sector if we don't have to
+
+
+// Reads cluster number in EAX into [ES:0000]
+ReadCluster:
+ // StartSector = ((Cluster - 2) * SectorsPerCluster) + ReservedSectors + HiddenSectors//
+
+ dec eax
+ dec eax
+ xor edx, edx
+ movzx ebx, byte ptr ds:[SectsPerCluster]
+ mul ebx
+ push eax
+ xor edx, edx
+ movzx eax, byte ptr ds:[NumberOfFats]
+ mul dword ptr ds:[SectorsPerFatBig]
+ movzx ebx, word ptr ds:[ReservedSectors]
+ add eax, ebx
+ add eax, dword ptr ds:[HiddenSectors]
+ pop ebx
+ add eax, ebx // EAX now contains the logical sector number of the cluster
+ xor bx, bx // We will load it to [ES:0000], ES loaded before function call
+ movzx cx, byte ptr ds:[SectsPerCluster]
+ call ReadSectors
+ ret
+
+// Displays a file not found error message
+// And reboots
+PrintFileNotFound:
+ mov si, offset msgFreeLdr // FreeLdr not found message
+ call PutChars // Display it
+ mov si, offset msgAnyKey // Press any key message
+ call PutChars // Display it
+
+ jmp Reboot
+
+msgFreeLdr:
+ db "freeldr.sys not found", 13, 10, 0
+filename:
+ db "FREELDR SYS"
+msgLoading:
+ db "Loading FreeLoader...", 13, 10, 0
+
+ //times 1022-($-$$) db 0 // Pad to 1022 bytes
+
+ dw 0aa55h // BootSector signature
+
+.endcode16
+
+END
Propchange: trunk/reactos/boot/freeldr/bootsect/fat32.S
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/gcc.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/gcc.cmake?rev=52143&r1=521…
==============================================================================
--- trunk/reactos/gcc.cmake [iso-8859-1] (original)
+++ trunk/reactos/gcc.cmake [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -314,7 +314,7 @@
list(APPEND ${_out_compile_flags} -D${item})
endforeach()
endif()
-
+
separate_arguments(${_out_compile_flags})
endmacro()
@@ -323,9 +323,32 @@
#get_filename_component(_basename ${_FILE} NAME)
#set(_gch_filename ${_basename}.gch)
#_PCH_GET_COMPILE_FLAGS(${_target_name} _args ${_header_filename})
-
+
#add_custom_command(OUTPUT ${_gch_filename} COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} ${_args} DEPENDS ${_header_filename})
#get_target_property(_src_files ${_target_name} SOURCES)
#set_source_files_properties(${_src_files} PROPERTIES COMPILE_FLAGS "-Winvalid-pch -fpch-preprocess" #OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_gch_filename})
#add_linkerflag(${_target_name} "${_gch_filename}")
endmacro()
+
+macro(CreateBootSectorTarget _target_name _asm_file _object_file _base_address)
+ get_filename_component(OBJECT_PATH ${_object_file} PATH)
+ get_filename_component(OBJECT_NAME ${_object_file} NAME)
+ file(MAKE_DIRECTORY ${OBJECT_PATH})
+ get_directory_property(defines COMPILE_DEFINITIONS)
+ get_directory_property(includes INCLUDE_DIRECTORIES)
+
+ foreach(arg ${defines})
+ set(result_defs ${result_defs} -D${arg})
+ endforeach()
+
+ foreach(arg ${includes})
+ set(result_incs -I${arg} ${result_incs})
+ endforeach()
+
+ add_custom_command(
+ OUTPUT ${_object_file}
+ COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file}
+ DEPENDS ${_asm_file})
+ set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE)
+ add_custom_target(${_target_name} ALL DEPENDS ${_object_file})
+endmacro()
Modified: trunk/reactos/msc.cmake
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/msc.cmake?rev=52143&r1=521…
==============================================================================
--- trunk/reactos/msc.cmake [iso-8859-1] (original)
+++ trunk/reactos/msc.cmake [iso-8859-1] Tue Jun 7 23:22:38 2011
@@ -191,3 +191,28 @@
#pseh workaround
set(PSEH_LIB "pseh")
+
+macro(CreateBootSectorTarget _target_name _asm_file _binary_file _base_address)
+
+ set(_object_file ${_binary_file}.obj)
+ set(_temp_file ${_binary_file}.tmp)
+
+ add_custom_command(
+ OUTPUT ${_temp_file}
+ COMMAND ${CMAKE_C_COMPILER} /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm /D__ASM__ /D_USE_ML /EP /c ${_asm_file} > ${_temp_file}
+ DEPENDS ${_asm_file})
+
+ add_custom_command(
+ OUTPUT ${_object_file}
+ COMMAND ml /nologo /Cp /Fo${_object_file} /c /Ta ${_temp_file}
+ DEPENDS ${_temp_file})
+
+ add_custom_command(
+ OUTPUT ${_binary_file}
+ COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
+ DEPENDS ${_object_file})
+
+ set_source_files_properties(${_object_file} ${_temp_file} ${_binary_file} PROPERTIES GENERATED TRUE)
+
+ add_custom_target(${_target_name} ALL DEPENDS ${_binary_file})
+endmacro()