Windows Areo

Development of Vista

this might be the layout of the Windows Vista NTTREE Found in the Vista WDK Makefile.plt

You might want to install the Longhorn Driver Kit or LDK and SDK the Samples from the SDK or in the PDC 2003 Whideby DVD and the SDK Help. Here is a link to the 2003 PDCand PDC 2003 Whideby DVD

In the LDK Samples you might want to start a GIT Repo in the OS directory.

Download the Windows API Code Pack extract it.
Download it from my Sharepoint drive

You can read about the Windows API Code Pack from the Code Project here

Please refactor with Visual Studio 2017, 2019 on 10 or 2005 in the XP VM,
the namespace 'Microsoft.WindowsAPICodePack' to 'Microsoft.Windows'
Set up a Lab03_N a buffer lab with a "N' NOT A FINAL LAB or a Longhorn build number 
in private with the Longhorn LDK and SDK, .NET Framework 2.1 and start making NT Projects 
in private. I'm at Microsoft research downloading systems papers
And it wont be a Final lab until. Try and code your own Longhorn Beta with 
the Longhorn Migration guite may help as well
as the PDC 2003 Discs there are 5 or 6.

Windows Vista/7 Samples

In further posts we will get into the login screen and GINA

Install Longhorn in a Virtual Machine and mount the VHD in XP to dismantle the Time Bomb.

The First Sample well go over is the Login Screen Sample in the Longhorn SDK

Install the 2008 SDK and WDK copy the 6.1 and sdk files to a Lab08_n and 
take note the the Vista samples directory is really your 'NT' directory. 
Install Visual Studio 2008 Team Suite  and the Phoniex 2008 SDK 
that contains the LISP Kit and the new C++ Pascal compiler source.
The Vista Source Tree file structure is in the DDK Bin Makefile.plt file.
and compare both sdk and wdk with directories with windiff and carefully go through the samples and src directories and 
compare and recreate Lab03 save both setenv.bat files and name the apporiate files setenv.sdk and setenv.ddk.
After your done and you set the ddk environment. You can set up the VS Directory with SharpDevelop,  
The Common Compiler Infustructure, Dafney, .NET Framework 3.0 Reference Source,Symbols Windows API Code Pack, 
The Visual Studio Project System and Spec#.

Here is a VAD Tree acedemic paper

			
	

!IFNDEF _NTROOT
_NTROOT=\nt
!ENDIF

!IFNDEF BASEDIR
BASEDIR=$(_NTDRIVE)$(_NTROOT)
!ENDIF

# A couple of overrides
!ifndef PUBLIC_ROOT
PUBLIC_ROOT=$(BASEDIR)\public
!endif

__LATEST_NT_TARGET_VERSION=0x601

!ifndef _NT_TARGET_VERSION # Default to current OS version
_NT_TARGET_VERSION = $(__LATEST_NT_TARGET_VERSION)
!endif

!ifndef _NT_TOOLS_VERSION # Default to current VC version
_NT_TOOLS_VERSION = 0x800
!endif

!ifndef SDK_PATH
SDK_PATH = $(PUBLIC_ROOT)\sdk
!endif

!ifndef SDK_INC_PATH
SDK_INC_PATH = $(SDK_PATH)\inc
!endif

!ifndef SDK_REF_PATH
SDK_REF_PATH = $(SDK_PATH)\ref
!endif

!ifndef SDK_INC16_PATH
SDK_INC16_PATH = $(SDK_PATH)\inc16
!endif

!ifndef SDK_LIB_DEST
SDK_LIB_DEST = $(SDK_PATH)\lib
!endif

!ifndef SDK_LIB_PATH
SDK_LIB_PATH = $(SDK_LIB_DEST)\*
!endif

!ifndef SDK_LIB16_PATH
SDK_LIB16_PATH=$(SDK_PATH)\lib16
!endif

!ifndef DDK_PATH
DDK_PATH = $(PUBLIC_ROOT)\ddk
!endif

!ifndef DDK_INC_PATH
DDK_INC_PATH = $(DDK_PATH)\inc
!endif

!ifndef KMDF_INC_PATH
KMDF_INC_PATH = $(DDK_PATH)\inc\wdf\kmdf
!endif

!ifndef KMDF_VER_PATH_1_5
KMDF_VER_PATH_1_5 = 1.5
!endif

!ifndef KMDF_VER_PATH_1_7
KMDF_VER_PATH_1_7 = 1.7
!endif

!ifndef KMDF_VERSION_MINOR_LATEST
KMDF_VERSION_MINOR_LATEST=9
!endif

!ifndef KMDF_VER_PATH_LATEST
KMDF_VER_PATH_LATEST = 1.$(KMDF_VERSION_MINOR_LATEST)
!endif

# default to current KMDF version
!ifndef KMDF_VER_PATH
KMDF_VER_PATH = $(KMDF_VER_PATH_LATEST)
!endif

!ifndef KMDF_LIB_PATH
KMDF_LIB_PATH = $(DDK_LIB_PATH)\wdf\kmdf
!endif

!ifndef UMDF_INC_PATH
UMDF_INC_PATH = $(DDK_PATH)\inc\wdf\umdf
!endif

!ifndef UMDF_VER_PATH_1_5
UMDF_VER_PATH_1_5 = 1.5
!endif

!ifndef UMDF_VER_PATH_1_7
UMDF_VER_PATH_1_7 = 1.7
!endif

!ifndef UMDF_VERSION_MINOR_LATEST
UMDF_VERSION_MINOR_LATEST=9
!endif

!ifndef UMDF_VER_PATH_LATEST
UMDF_VER_PATH_LATEST = 1.$(UMDF_VERSION_MINOR_LATEST)
!endif

# default to current UMDF version
!ifndef UMDF_VER_PATH
UMDF_VER_PATH = $(UMDF_VER_PATH_LATEST)
!endif

!ifndef DDK_LIB_DEST
DDK_LIB_DEST = $(DDK_PATH)\lib
!endif

!ifndef DDK_LIB_PATH
DDK_LIB_PATH = $(DDK_LIB_DEST)\*
!endif

!ifndef UMDF_LIB_PATH
UMDF_LIB_PATH = $(DDK_LIB_DEST)\umdf
!endif

!ifndef IFSKIT_PATH
IFSKIT_PATH = $(PUBLIC_ROOT)\ifskit
!endif

!ifndef IFSKIT_INC_PATH
IFSKIT_INC_PATH = $(IFSKIT_PATH)\inc
!endif

!ifndef IFSKIT_LIB_DEST
IFSKIT_LIB_DEST = $(IFSKIT_PATH)\lib
!endif

!ifndef IFSKIT_LIB_PATH
IFSKIT_LIB_PATH = $(IFSKIT_LIB_DEST)\*
!endif

!ifndef HALKIT_PATH
HALKIT_PATH = $(PUBLIC_ROOT)\halkit
!endif

!ifndef HALKIT_INC_PATH
HALKIT_INC_PATH = $(HALKIT_PATH)\inc
!endif

!ifndef HALKIT_LIB_DEST
HALKIT_LIB_DEST = $(HALKIT_PATH)\lib
!endif

!ifndef HALKIT_LIB_PATH
HALKIT_LIB_PATH = $(HALKIT_LIB_DEST)\*
!endif

!ifndef WDM_INC_PATH
WDM_INC_PATH = $(DDK_INC_PATH)\wdm
!endif

!ifndef CRT_INC_PATH
CRT_INC_PATH = $(SDK_INC_PATH)\crt
!endif

!ifndef IOSTREAMS_INC_PATH
IOSTREAMS_INC_PATH = $(SDK_INC_PATH)\crt\iostreams
!endif

!ifndef STL6_INC_PATH
STL6_INC_PATH = $(SDK_INC_PATH)\crt\stl60
!endif

!ifndef STL7_INC_PATH
STL7_INC_PATH = $(SDK_INC_PATH)\crt\stl70
!endif

!ifndef CRT_LIB_PATH
CRT_LIB_PATH = $(SDK_LIB_PATH)
!endif

!ifndef OAK_INC_PATH
OAK_INC_PATH = $(PUBLIC_ROOT)\oak\inc
!endif

!ifndef OAK_BIN_PATH
OAK_BIN_PATH = $(PUBLIC_ROOT)\oak\binr
!endif

!ifndef OAK_INC_PATH
OAK_INC_PATH = $(PUBLIC_ROOT)\oak\inc
!endif

!ifndef ATL_LIB_PATH
ATL_LIB_PATH=$(SDK_LIB_PATH)
!endif

!ifndef MFC_LIB_PATH
MFC_LIB_PATH=$(SDK_LIB_PATH)
!endif

# "mfc$(MFC_VER)" will be appended to this in makefile.def to
# create MFC_INC_PATH
!ifndef MFC_INC_ROOT
MFC_INC_ROOT=$(SDK_INC_PATH)
!endif

# "atl$(ATL_VER)" will be appended to this in makefile.def to
# create ATL_INC_PATH
!ifndef ATL_INC_ROOT
ATL_INC_ROOT=$(SDK_INC_PATH)
!endif

!ifndef WPP_CONFIG_PATH
# If this ever changes you must change the DDK's setenv.bat
WPP_CONFIG_PATH = $(RAZZLETOOLPATH)\WppConfig
!endif

!ifndef PUBLIC_INTERNAL_PATH
PUBLIC_INTERNAL_PATH = $(PUBLIC_ROOT)\internal
!endif

!if defined(USE_OBJECT_ROOT) && "$(USE_OBJECT_ROOT)" != "0" && "$(USE_OBJECT_ROOT)" != "1"
!  error USE_OBJECT_ROOT must be 0 or 1 or not defined.
!endif

!if !defined(USE_OBJECT_ROOT)
!  if "$(BUILD_PRODUCT)" == "NT"
USE_OBJECT_ROOT=1
!  else
USE_OBJECT_ROOT=0
!  endif
!endif

COPYRIGHT_STRING = Copyright (c) Microsoft Corporation. All rights reserved.

# perl.exe disabled for WDK only
_DEL=del $@ $@.temp 2>nul
_DELFILE=del
_MOVE=move $@.temp $@ >nul
_PERL=echo perl.exe
_TYPE=type
_COPYFILE=copy
_IF=if

# debugging support
!ifdef BUILD_DEBUG
TYPE=rem
NOECHO=
BUILD_NOKEEP=KEEP
!else
TYPE=@$(_TYPE)
NOECHO=@
BUILD_NOKEEP=NOKEEP
!endif

BINPLACE_FLAGS=$(BINPLACE_FLAGS) -:LOGPDB

!ifndef PUBLISH_CMD
PUBLISH_CMD=$(_PERL) $(NTMAKEENV)\publish.pl /Pass:$(BUILD_PASS)
!endif

!ifndef BUILD_PASS
# Old build.exe.  Guess the correct pass.
!ifdef PASS0ONLY
BUILD_PASS=PASS0
!elseif defined(LINKONLY)
BUILD_PASS=PASS2
!elseif defined(NOLINK) && !defined(PASS0ONLY)
BUILD_PASS=PASS1
!else
# catch all - someone used build /z or build /2 or nmake
BUILD_PASS=PASSALL
!endif
!endif

#
# Set the flag which indicates whether we should be publishing binaries
# to 0 by default.  the project.mk file is responsible for parsing
# BINARY_PUBLISH_PROJECTS to determine if its value should be changed.
#

BINPUBLISH=0

#
# Define global project paths.
#

!include $(NTMAKEENV)\projects.inc

#
# Do this before project.mk so project.mk can use it.
#
!if ("$(NTDEBUG)" == "") || ("$(NTDEBUG)" == "ntsdnodbg")
FREEBUILD=1
!else
FREEBUILD=0
!endif

#
# Find and include the project configuration file.
#

!if exists(.\project.mk)
_PROJECT_MK_PATH=.
!elseif exists(..\project.mk)
_PROJECT_MK_PATH=..
!elseif exists(..\..\project.mk)
_PROJECT_MK_PATH=..\..
!elseif exists(..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..
!elseif exists(..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..
!elseif exists(..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..
!elseif exists(..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..\..\..\..\..
!elseif exists(..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\project.mk)
_PROJECT_MK_PATH=..\..\..\..\..\..\..\..\..\..\..\..\..\..\..
!endif

!if "$(_PROJECT_MK_PATH)" != ""
#!message "Including $(_PROJECT_MK_PATH)\project.mk"
!include $(_PROJECT_MK_PATH)\project.mk
!if exists($(_PROJECT_MK_PATH)\myproject.mk)
!include $(_PROJECT_MK_PATH)\myproject.mk
!endif
!else
#!message "Unable to find project.mk. Update makefile.plt or create project.mk."
!endif

!ifndef OBJECT_ROOT
OBJECT_ROOT=$(BASEDIR)
!endif

!IFDEF _PROJECT_

PROJECT_OBJ_ROOT=$(OBJECT_ROOT)\$(_PROJECT_)
PROJECT_ROOT=$(BASEDIR)\$(_PROJECT_)
PROJECT_PUBLIC_PATH=$(PUBLIC_INTERNAL_PATH)\$(_PROJECT_)
PROJECT_INC_PATH=$(PROJECT_PUBLIC_PATH)\inc
PRIVATE_INC_PATH=$(PROJECT_INC_PATH)
PROJECT_LIB_DEST=$(PROJECT_PUBLIC_PATH)\lib
PROJECT_LIB_PATH=$(PROJECT_LIB_DEST)\$(TARGET_DIRECTORY)
PROJECT_INF_PATH=$(PROJECT_PUBLIC_PATH)\inf
PROJECT_REF_PATH=$(PROJECT_PUBLIC_PATH)\ref

!ELSE
#!message "ERROR: _PROJECT_ is not defined. Should be defined in project.mk."
!ENDIF

#
# If not defined, define the build message banner.
#

!IFNDEF BUILDMSG
BUILDMSG=
!ENDIF

#
# Do this again in case project.mk changed it.
#
!if ("$(NTDEBUG)" == "") || ("$(NTDEBUG)" == "ntsdnodbg")
FREEBUILD=1
! ifndef BUILD_TYPE
BUILD_TYPE=fre
! endif
!else
FREEBUILD=0
! ifndef BUILD_TYPE
BUILD_TYPE=chk
! endif
!endif


# Allow alternate object directories.

!if "$(BUILD_PRODUCT)" != "NT" && !defined(BUILD_ALT_DIR) && defined(CHECKED_ALT_DIR) && !$(FREEBUILD)
BUILD_ALT_DIR=d
!endif

_OBJ_DIR = obj$(BUILD_ALT_DIR)

# define a simple macro that can be used for the object subdir in makefile.inc/sources files

O = $(_OBJ_DIR)\$(TARGET_DIRECTORY)

#
# Determine which target is being built (i386 or ia64) and define
# the appropriate target variables.
#

!IFNDEF 386
386=0
!ENDIF

!IFNDEF AMD64
AMD64=0
!ENDIF

!IFNDEF IA64
IA64=0
!ENDIF

!IFNDEF ARM
ARM=0
!ENDIF

# Disable.
PPC=0
MPPC=0
MIPS=0
AXP64=0
ALPHA=0

#
# Default to building for the i386 target, if no target is specified.
#

!IF !$(386)
! IF !$(AMD64)
!  IF !$(IA64)
!   IF !$(ARM)
386=1
!   ENDIF
!  ENDIF
! ENDIF
!ENDIF

PLATFORM_MFC_VER=0x0600
TLB_SWITCHES=/tlb

#
# Define the target platform specific information.
#

!if $(386)

ASM_SUFFIX=asm
ASM_INCLUDE_SUFFIX=inc

TARGET_BRACES=

!ifdef SUBSTITUTE_386_CC
TARGET_CPP=$(SUBSTITUTE_386_CC)
!else
TARGET_CPP=cl.exe
!endif

MIDL_PLATFORM_FLAG=/win32

TARGET_DEFINES=/Di386 /D_X86_
TARGET_DIRECTORY=i386
!ifndef _NTTREE
! ifdef _NTX86TREE
_NTTREE=$(_NTX86TREE)
! elseif defined(_NT386TREE)
_NTTREE=$(_NT386TREE)
! endif
!endif

VCCOM_SUPPORTED=1
SCP_SUPPORTED=1
WIN64=0
MACHINE_TYPE=ix86
TLBIMP_MACHINE=/machine:x86
TLBEXP_MACHINE=/Win32
ILASM_MACHINE_SWITCH=
ANSI_ANNOTATION=0
DEFAULT_MSC_OPT=/Oxs
TARGET_CSC=csc

!elseif $(AMD64)

ASM_SUFFIX=asm
ASM_INCLUDE_SUFFIX=inc

TARGET_BRACES=
!ifdef SUBSTITUTE_AMD64_CC
TARGET_CPP=$(SUBSTITUTE_AMD64_CC)
!else
TARGET_CPP=cl.exe
!endif
TARGET_DEFINES=/D_AMD64_ /D_WIN64
MIDL_PLATFORM_FLAG=/amd64
TARGET_DIRECTORY=amd64

!ifndef _NTTREE
! ifdef _NTAMD64TREE
_NTTREE=$(_NTAMD64TREE)
! endif
!endif

VCCOM_SUPPORTED=1
SCP_SUPPORTED=0
WIN64=1
MACHINE_TYPE=amd64
TLBIMP_MACHINE=/machine:x64
TLBEXP_MACHINE=/Win64
ILASM_MACHINE_SWITCH=/x64
ANSI_ANNOTATION=0
DEFAULT_MSC_OPT=/Oxs 
!elseif $(IA64)

ASM_SUFFIX=s
ASM_INCLUDE_SUFFIX=h

TARGET_BRACES=-B
TARGET_CPP=cl.exe
TARGET_DEFINES=/DIA64 /D_IA64_
TARGET_DIRECTORY=ia64
MIDL_PLATFORM_FLAG=/ia64

!ifndef _NTTREE
! ifdef _NTIA64TREE
_NTTREE=$(_NTIA64TREE)
! endif
!endif

WIN64=1
SCP_SUPPORTED=0
MACHINE_TYPE=ia64
TLBIMP_MACHINE=/machine:Itanium
TLBEXP_MACHINE=/Win64
ILASM_MACHINE_SWITCH=/Itanium

ANSI_ANNOTATION=0
DEFAULT_MSC_OPT=/Oxs

!elseif $(ARM)

ASM_SUFFIX=s
ASM_INCLUDE_SUFFIX=inc

TARGET_BRACES=
TARGET_CPP=clarm.exe
TARGET_DEFINES=/D_ARM_
TARGET_DIRECTORY=arm

!ifndef _NTTREE
! ifdef _NTARMTREE
_NTTREE=$(_NTARMTREE)
! endif
!endif

VCCOM_SUPPORTED=0
SCP_SUPPORTED=0
WIN64=0
PLATFORM_MFC_VER=0x0600
MACHINE_TYPE=arm
ANSI_ANNOTATION=0
DEFAULT_MSC_OPT=/Oxs

!else
!error Must define the target as 386, ia64, amd64, or arm.
!endif

#
#  These flags don't depend on i386 etc. however have to be in this file.
#
#  MIDL_OPTIMIZATION is the optimization flag set for the current NT.
#  MIDL_OPTIMIZATION_NO_ROBUST is the current optimization without robust.
#
!ifdef MIDL_PROTOCOL
MIDL_PROTOCOL_DEFAULT=/protocol $(MIDL_PROTOCOL)
!else
MIDL_PROTOCOL_DEFAULT=/protocol all
!endif

!if $(WIN64)
MIDL_OPTIMIZATION_NO_ROBUST=/Oicf /error all $(MIDL_PLATFORM_FLAG)
MIDL_OPTIMIZATION_NT4=/Oicf /error all $(MIDL_PLATFORM_FLAG) 
!else
MIDL_OPTIMIZATION_NO_ROBUST=/Oicf /error all /no_robust $(MIDL_PLATFORM_FLAG) 
MIDL_OPTIMIZATION_NT4=/Oicf /error all /no_robust $(MIDL_PLATFORM_FLAG) 
!endif
MIDL_OPTIMIZATION_NT5=/Oicf /robust /error all $(MIDL_PROTOCOL_DEFAULT) $(MIDL_PLATFORM_FLAG) 
!ifdef SUBSTITUTE_MIDL_CC
MIDL_CPP=$(SUBSTITUTE_MIDL_CC)
!else
MIDL_CPP=$(TARGET_CPP)
!endif
MIDL_FLAGS=$(TARGET_DEFINES) /D_WCHAR_T_DEFINED

! if $(WIN64)
MIDL_ALWAYS_GENERATE_STUBS=1
! else
MIDL_ALWAYS_GENERATE_STUBS=0
! endif

CLEANSE_PUBLISHED_HDR=$(_COPYFILE)

PATH_TOOLS16=$(RAZZLETOOLPATH)\tools16

#
# If a build path is defined, use it.
#
!ifdef BUILD_PATH
PATH=$(BUILD_PATH)
!endif

BINPLACE_PLACEFILE_DIR=$(NTMAKEENV)

!if exist(makefil0) && "$(SDK_INC_PATH)" != "" && exist($(SDK_INC_PATH)\ntverpmk.inc)
!include $(SDK_INC_PATH)\ntverpmk.inc
!endif

!if exist ($(OBJECT_ROOT)\$O\__blddate__)
!include $(OBJECT_ROOT)\$O\__blddate__
!endif

!if exist ($(OBJECT_ROOT)\$O\__bldnum__)
!include $(OBJECT_ROOT)\$O\__bldnum__
!endif

#
# Make $O available as an environment variable.
# This does not cost a CreateProcess, it is emulated by nmake.
#
# TBD -- get rid of this.
#
!if [set O=$(O)]
!endif

#
# This does not cost a CreateProcess, it is emulated by nmake.
#
# TBD -- get rid of this.
#
!if defined(URT_VER) && [set URT_VER=$(URT_VER)]
!endif

# This does not cost a CreateProcess, it is emulated by nmake.
!if [set BINPLACE_PDB_DLL=mspdb80.dll]
!endif

!if defined(MAKEDIR_RELATIVE_TO_BASEDIR) # { {
#
# OBJ_PATH is the path under OBJECT_ROOT associated with your source.
#
# To pick up your neighor's .lib, you say
#   TARGETLIBS=$(OBJ_PATH)\..\foo\$O\foo.lib.
#
# To pick up your neighbor's midl outputs, you say:
#   INCLUDES=$(OBJ_PATH)\..\foo\$O
#
# To pick up your midl outputs, you say:
#   INCLUDES=$(OBJ_PATH)\$O
#
# To build midl outputs, you say:
#   SOURCES=$(OBJ_PATH)\$O\foo_i.c
#
# Build.exe passes MAKEDIR_RELATIVE_TO_BASEDIR on the command line.
# Build.exe also lowercases _NTDRIVE, _NTROOT, BASEDIR, OBJECT_ROOT.
# If MAKEDIR_RELATIVE_TO_BASEDIR is not on the command line, then nmake must compute it itself.
#
!if "$(MAKEDIR_RELATIVE_TO_BASEDIR)" == ""
!undef MAKEDIR_RELATIVE_TO_BASEDIR
!endif

!if defined(OBJECT_ROOT) && $(USE_OBJECT_ROOT)
!if defined(MAKEDIR_RELATIVE_TO_BASEDIR)

OBJ_PATH=$(OBJECT_ROOT)\$(MAKEDIR_RELATIVE_TO_BASEDIR)

!elseif defined(WDK_ALTERNATE_MAKEDIR)

OBJ_PATH=$(OBJECT_ROOT)\$(WDK_ALTERNATE_MAKEDIR)

!else

OBJ_PATH=$(MAKEDIR)

!endif
!endif

!else # } {

MAKEDIR_LOWERCASE=$(MAKEDIR)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:A=a)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:B=b)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:C=c)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:D=d)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:E=e)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:F=f)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:G=g)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:H=h)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:I=i)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:J=j)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:K=k)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:L=l)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:M=m)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:N=n)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:O=o)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:P=p)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:Q=q)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:R=r)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:S=s)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:T=t)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:U=u)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:V=v)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:W=w)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:X=x)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:Y=y)
MAKEDIR_LOWERCASE=$(MAKEDIR_LOWERCASE:Z=z)

BASEDIR=$(BASEDIR:A=a)
BASEDIR=$(BASEDIR:B=b)
BASEDIR=$(BASEDIR:C=c)
BASEDIR=$(BASEDIR:D=d)
BASEDIR=$(BASEDIR:E=e)
BASEDIR=$(BASEDIR:F=f)
BASEDIR=$(BASEDIR:G=g)
BASEDIR=$(BASEDIR:H=h)
BASEDIR=$(BASEDIR:I=i)
BASEDIR=$(BASEDIR:J=j)
BASEDIR=$(BASEDIR:K=k)
BASEDIR=$(BASEDIR:L=l)
BASEDIR=$(BASEDIR:M=m)
BASEDIR=$(BASEDIR:N=n)
BASEDIR=$(BASEDIR:O=o)
BASEDIR=$(BASEDIR:P=p)
BASEDIR=$(BASEDIR:Q=q)
BASEDIR=$(BASEDIR:R=r)
BASEDIR=$(BASEDIR:S=s)
BASEDIR=$(BASEDIR:T=t)
BASEDIR=$(BASEDIR:U=u)
BASEDIR=$(BASEDIR:V=v)
BASEDIR=$(BASEDIR:W=w)
BASEDIR=$(BASEDIR:X=x)
BASEDIR=$(BASEDIR:Y=y)
BASEDIR=$(BASEDIR:Z=z)

OBJECT_ROOT=$(OBJECT_ROOT:A=a)
OBJECT_ROOT=$(OBJECT_ROOT:B=b)
OBJECT_ROOT=$(OBJECT_ROOT:C=c)
OBJECT_ROOT=$(OBJECT_ROOT:D=d)
OBJECT_ROOT=$(OBJECT_ROOT:E=e)
OBJECT_ROOT=$(OBJECT_ROOT:F=f)
OBJECT_ROOT=$(OBJECT_ROOT:G=g)
OBJECT_ROOT=$(OBJECT_ROOT:H=h)
OBJECT_ROOT=$(OBJECT_ROOT:I=i)
OBJECT_ROOT=$(OBJECT_ROOT:J=j)
OBJECT_ROOT=$(OBJECT_ROOT:K=k)
OBJECT_ROOT=$(OBJECT_ROOT:L=l)
OBJECT_ROOT=$(OBJECT_ROOT:M=m)
OBJECT_ROOT=$(OBJECT_ROOT:N=n)
OBJECT_ROOT=$(OBJECT_ROOT:O=o)
OBJECT_ROOT=$(OBJECT_ROOT:P=p)
OBJECT_ROOT=$(OBJECT_ROOT:Q=q)
OBJECT_ROOT=$(OBJECT_ROOT:R=r)
OBJECT_ROOT=$(OBJECT_ROOT:S=s)
OBJECT_ROOT=$(OBJECT_ROOT:T=t)
OBJECT_ROOT=$(OBJECT_ROOT:U=u)
OBJECT_ROOT=$(OBJECT_ROOT:V=v)
OBJECT_ROOT=$(OBJECT_ROOT:W=w)
OBJECT_ROOT=$(OBJECT_ROOT:X=x)
OBJECT_ROOT=$(OBJECT_ROOT:Y=y)
OBJECT_ROOT=$(OBJECT_ROOT:Z=z)

MAKEDIR_RELATIVE_TO_BASEDIR=$(MAKEDIR_LOWERCASE)
!if !defined(_IN_MAKEFILE_PLT) && !exist($(OBJECT_ROOT)\$O\makedir_relative_to_basedirmk.inc) && exist($(BASEDIR)\makefil0)
!if  [nmake.exe /nologo /f $(BASEDIR)\makefil0 _IN_MAKEFILE_PLT=1 $(OBJECT_ROOT)\$O\makedir_relative_to_basedirmk.inc]
!endif
!endif
!if exist($(OBJECT_ROOT)\$O\makedir_relative_to_basedirmk.inc)
!include $(OBJECT_ROOT)\$O\makedir_relative_to_basedirmk.inc
!else
!endif

!if "$(MAKEDIR_LOWERCASE)" == "$(BASEDIR)"
MAKEDIR_RELATIVE_TO_BASEDIR=.
!endif

#
# Is MAKEDIR not under MAKEDIR_RELATIVE_TO_BASEDIR?
# Or are we early in the build such that $(OBJECT_ROOT)\$O\makedir_relative_to_basedirmk.inc doesn't yet exist?
#
!if "$(MAKEDIR_RELATIVE_TO_BASEDIR)" == "$(MAKEDIR_LOWERCASE)"
!undef MAKEDIR_RELATIVE_TO_BASEDIR
!endif

#
# First set OBJ_PATH independent of USE_OBJECT_ROOT. Makefile.def changes OBJ_PATH
# back to MAKEDIR if USE_OBJECT_ROOT is 0. This way you can set it
# in sources files, though it is usually set in project.mk or the environment
# or defaulted based on BUILD_PRODUCT. Setting it in any of those is prefered
# over setting it in sources files in order to make it visible to makefil0.
#
!if defined(OBJECT_ROOT) && defined(MAKEDIR_RELATIVE_TO_BASEDIR)
OBJ_PATH=$(OBJECT_ROOT)\$(MAKEDIR_RELATIVE_TO_BASEDIR)
!else
OBJ_PATH=$(MAKEDIR)
!endif

!endif # } }

!if defined(_PROJECT_MK_PATH)
_PROJECT_MK_OBJ_PATH=$(OBJ_PATH)\$(_PROJECT_MK_PATH)
!endif

#
# Put TEMP in $O unless it has spaces.
# This ensures no files are left in TEMP -- via scorch/build /c -- all of which
# are in the business of cleaning up $O whereas nothing in the build cleans up $TEMP.
#
# This gives TEMP other characteristics of OBJECT_ROOT/BASEDIR, such as realtime antivirus scanner disabling.
#
# It can be spindle-unfriendly, but if TEMP files are deleted and never leave the file system cache,
# it is spindle-ok.
#
!if defined(MAKEDIR_RELATIVE_TO_BASEDIR)
!if "$(OBJ_PATH: =)" == "$(OBJ_PATH)"
!if [set TEMP=$(OBJ_PATH)\$O]
!endif
!if [set TMP=$(OBJ_PATH)\$O]
!endif
!if !exist($(OBJ_PATH)\$O)
!if [mkdir $(OBJ_PATH)\$O]
!endif
!endif
!endif
!endif

!if ("$(MUI)" == "0")
!  ifndef MUI_COMMENT
MUI_COMMENT = ENVIRONMENT_DISABLED
!  endif
!endif