Merge trunk (r43561)

svn path=/branches/ros-amd64-bringup/; revision=43562
This commit is contained in:
Timo Kreuzer
2009-10-18 17:24:21 +00:00
203 changed files with 11172 additions and 3640 deletions
@@ -196,6 +196,8 @@ int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int iCm
SaveSettings();
try { throw 0; } catch (int i) { } /* HACK */
return msg.wParam;
}
@@ -0,0 +1,89 @@
/*
* PROJECT: Spider Solitaire
* LICENSE: See COPYING in top level directory
* FILE: base/applications/games/spider/lang/pl-PL.rc
* PURPOSE: Polish Language File for Spider Solitaire
* TRANSLATOR: Maciej Bialas
*/
#include "resource.h"
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
/* Dialogs */
IDD_CARDBACK DIALOGEX 6, 6, 186, 104
CAPTION "Wybierz koszulkê talii"
FONT 8, "MS Shell Dlg"
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
BEGIN
CONTROL "", IDC_CARDBACK1, "Static", SS_NOTIFY, 4, 7, 26, 32
CONTROL "", IDC_CARDBACK2, "Static", SS_NOTIFY, 34, 7, 26, 32
CONTROL "", IDC_CARDBACK3, "Static", SS_NOTIFY, 64, 7, 26, 32
CONTROL "", IDC_CARDBACK4, "Static", SS_NOTIFY, 94, 7, 26, 32
CONTROL "", IDC_CARDBACK5, "Static", SS_NOTIFY, 124, 7, 26, 32
CONTROL "", IDC_CARDBACK6, "Static", SS_NOTIFY, 154, 7, 26, 32
CONTROL "", IDC_CARDBACK7, "Static", SS_NOTIFY, 4, 46, 26, 32
CONTROL "", IDC_CARDBACK8, "Static", SS_NOTIFY, 34, 46, 26, 32
CONTROL "", IDC_CARDBACK9, "Static", SS_NOTIFY, 64, 46, 26, 32
CONTROL "", IDC_CARDBACK10, "Static", SS_NOTIFY, 94, 46, 26, 32
CONTROL "", IDC_CARDBACK11, "Static", SS_NOTIFY, 124, 46, 26, 32
CONTROL "", IDC_CARDBACK12, "Static", SS_NOTIFY, 154, 46, 26, 32
DEFPUSHBUTTON "OK", IDOK, 66, 84, 54, 13
PUSHBUTTON "Anuluj", IDCANCEL, 126, 84, 54, 13
END
IDD_DIFFICULTY DIALOGEX DISCARDABLE 100, 100, 106, 80
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
CAPTION "Poziom trudnoœci"
FONT 8, "MS Shell Dlg"
BEGIN
AUTORADIOBUTTON "£atwy: &Jeden kolor", IDC_DIF_ONECOLOR, 8, 10, 80, 10, WS_GROUP | WS_TABSTOP
AUTORADIOBUTTON "Œredni: &Dwa kolory", IDC_DIF_TWOCOLORS, 8, 23, 80, 10
AUTORADIOBUTTON "Trudny: &Cztery kolory", IDC_DIF_FOURCOLORS, 8, 36, 80, 10
DEFPUSHBUTTON "OK", IDOK, 8, 58, 40, 14
PUSHBUTTON "Anuluj", IDCANCEL, 58, 58, 40, 14
END
/* Strings */
STRINGTABLE
BEGIN
IDS_SPI_NAME "Paj¹k"
IDS_SPI_ABOUT "Pasjans - Paj¹k, autor: Gregor Schneider\n\nCardLib wersja 1.0"
IDS_SPI_QUIT "Czy na pewno chcesz zakoñczyæ?"
IDS_SPI_WIN "Gratulacje, wygra³eœ(aœ)!"
IDS_SPI_DEAL "Rozdaæ ponownie?"
END
/* Menus */
IDR_MENU1 MENU DISCARDABLE
BEGIN
POPUP "&Gra"
BEGIN
MENUITEM "&Nowa Gra\tF2", IDM_GAME_NEW
MENUITEM SEPARATOR
MENUITEM "&Talia...", IDM_GAME_DECK
MENUITEM SEPARATOR
MENUITEM "&Wyjœcie", IDM_GAME_EXIT
END
POPUP "&Pomoc"
BEGIN
MENUITEM "&ZawartoϾ\tF1", IDM_HELP_CONTENTS
MENUITEM "&O programie", IDM_HELP_ABOUT
END
END
/* Accelerator */
IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE
BEGIN
VK_F1, IDM_HELP_CONTENTS, VIRTKEY, NOINVERT
VK_F2, IDM_GAME_NEW, VIRTKEY, NOINVERT
END
@@ -10,5 +10,6 @@ IDI_SPIDER ICON DISCARDABLE "spider.ico"
#include "lang/es-ES.rc"
#include "lang/it-IT.rc"
#include "lang/ja-JP.rc"
#include "lang/pl-PL.rc"
#include "lang/ru-RU.rc"
@@ -154,6 +154,9 @@ int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int iCm
DispatchMessage(&msg);
}
}
try { throw 0; } catch (int i) { } /* HACK */
return msg.wParam;
}
@@ -98,13 +98,44 @@ void NewGame(void)
fGameStarted = false;
}
bool stackLookingGood(const CardStack &mystack, int numChecks)
{
int i;
for (i = 0; i < numChecks; i++)
{
if (mystack[i].LoVal() != mystack[i + 1].LoVal() - 1)
{
return false;
}
if (mystack[i].Suit() != mystack[i + 1].Suit())
{
return false;
}
}
return true;
}
/* Card to be turned from a stack */
void TurnStackCard(CardRegion &stackobj)
{
int numfacedown;
stackobj.GetFaceDirection(&numfacedown);
if (stackobj.NumCards() <= numfacedown)
{
if (numfacedown > 0) numfacedown--;
stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown);
stackobj.Redraw();
}
}
/* Click on the deck */
void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int NumDragCards)
{
CardStack temp, fakeDeck = pDeck->GetCardStack();
fGameStarted = true;
int i;
int i, j, facedown, faceup;
if (fakeDeck.NumCards() != 0 && deck.NumCards() != 0)
{
/* Add one card to every stack */
@@ -112,6 +143,25 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int NumDragCards)
{
temp = pStack[i]->GetCardStack();
temp.Push(deck.Pop());
/* Check if we accidentally finished a row */
pStack[i]->GetFaceDirection(&facedown);
faceup = temp.NumCards() - facedown;
if (faceup >= NUM_ONECOLOR_CARDS)
{
/* Check stack finished, remove cards if so */
if (stackLookingGood(temp, NUM_ONECOLOR_CARDS - 1))
{
for (j = 0; j < NUM_ONECOLOR_CARDS; j++)
{
temp.RemoveCard(0);
}
cardsFinished += NUM_ONECOLOR_CARDS;
pStack[i]->SetCardStack(temp);
/* Turn now topmost card */
TurnStackCard(*pStack[i]);
}
}
pStack[i]->SetCardStack(temp);
}
/* Remove one card from the fake ones */
@@ -124,7 +174,7 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int NumDragCards)
/* Cards dragged from a stack */
bool CARDLIBPROC StackDragProc(CardRegion &stackobj, int numDragCards)
{
int numfacedown, numcards, i;
int numfacedown, numcards;
stackobj.GetFaceDirection(&numfacedown);
numcards = stackobj.NumCards();
@@ -134,30 +184,9 @@ bool CARDLIBPROC StackDragProc(CardRegion &stackobj, int numDragCards)
{
const CardStack &mystack = stackobj.GetCardStack();
/* Don't allow to drag unsuited cards */
for (i = 0; i < numDragCards - 1; i++)
{
if (mystack[i].LoVal() != mystack[i + 1].LoVal() - 1)
{
return false;
}
switch (dwDifficulty)
{
case IDC_DIF_ONECOLOR:
break;
case IDC_DIF_TWOCOLORS:
if ((mystack[i].IsBlack() && mystack[i + 1].IsBlack()) ||
(mystack[i].IsRed() && mystack[i + 1].IsRed()))
{
return false;
}
break;
case IDC_DIF_FOURCOLORS:
if (mystack[i].Suit() != mystack[i + 1].Suit())
{
return false;
}
break;
}
if (!stackLookingGood(mystack, numDragCards - 1))
{
return false;
}
/* Remember where the cards come from */
from = &stackobj;
@@ -193,20 +222,6 @@ void CARDLIBPROC StackAddProc(CardRegion &stackobj, const CardStack &added)
}
}
/* Card to be turned from a stack */
void TurnStackCard(CardRegion &stackobj)
{
int numfacedown;
stackobj.GetFaceDirection(&numfacedown);
if (stackobj.NumCards() <= numfacedown)
{
if (numfacedown > 0) numfacedown--;
stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown);
stackobj.Redraw();
}
}
/* Cards dropped to a stack */
bool CARDLIBPROC StackDropProc(CardRegion &stackobj, CardStack &dragcards)
{
@@ -230,49 +245,20 @@ bool CARDLIBPROC StackDropProc(CardRegion &stackobj, CardStack &dragcards)
return false;
}
/* Can only drop if card matches colour rule */
switch (dwDifficulty)
{
case IDC_DIF_ONECOLOR:
break;
case IDC_DIF_TWOCOLORS:
if ((mystack[0].IsBlack() && dragcard.IsRed()) ||
(mystack[0].IsRed() && dragcard.IsBlack()))
{
return false;
}
break;
case IDC_DIF_FOURCOLORS:
if (mystack[0].Suit() != dragcard.Suit())
{
return false;
}
break;
}
/* Check if stack complete */
stackobj.GetFaceDirection(&facedown);
faceup = stackobj.NumCards() - facedown;
if (faceup + dragcards.NumCards() >= NUM_ONECOLOR_CARDS)
{
int i, max = NUM_ONECOLOR_CARDS - dragcards.NumCards() - 1;
BOOL remove = true;
/* Dragged cards have been checked to be in order, start with the first stack card */
for (i = 0; i < max; i++)
{
if (mystack[i].Suit() != mystack[i + 1].Suit() ||
mystack[i].LoVal() != mystack[i + 1].LoVal() - 1)
{
remove = false;
break;
}
}
if (remove)
/* Dragged cards have been checked to be in order, check stack cards */
if (stackLookingGood(mystack, max))
{
CardStack s = stackobj.GetCardStack();
CardStack f;
/* Remove from card stack */
for (i = 0; i < max + 1; i++)
{
@@ -81,7 +81,7 @@ InstallDriver(
RtlCopyMemory(FullImagePath, PathPrefix.Buffer, PathPrefix.MaximumLength);
wcscat(FullImagePath, ImagePath);
DPRINT1("Using driver '%S' for device '%S'\n", ImagePath, DeviceId);
DPRINT("Using driver '%S' for device '%S'\n", ImagePath, DeviceId);
/* Create service key */
RtlInitUnicodeString(&StringU, Driver);
@@ -368,7 +368,7 @@ EventThread(IN LPVOID lpParameter)
DPRINT("Received PnP Event\n");
if (IsEqualIID(&PnpEvent->EventGuid, (REFGUID)&GUID_DEVICE_ENUMERATED))
{
DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);
DPRINT("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);
InstallDevice(hInf, hEnum, hServices, PnpEvent->TargetDevice.DeviceIds);
}
else
@@ -547,7 +547,7 @@ getpacket (void)
count = 0;
/* now, read until a # or end of buffer is found */
while (count < BUFMAX)
while (count < BUFMAX - 1)
{
ch = getDebugChar ();
if (ch == '$')
+38 -18
View File
@@ -21,12 +21,12 @@
VOID RunLoader(VOID)
{
CHAR SettingName[80];
CHAR SettingValue[80];
ULONG_PTR SectionId;
ULONG OperatingSystemCount;
PCSTR *OperatingSystemSectionNames;
PCSTR *OperatingSystemDisplayNames;
PCSTR SectionName;
ULONG DefaultOperatingSystem;
LONG TimeOut;
ULONG SelectedOperatingSystem;
@@ -93,28 +93,48 @@ VOID RunLoader(VOID)
TimeOut = -1;
// Try to open the operating system section in the .ini file
if (!IniOpenSection(OperatingSystemSectionNames[SelectedOperatingSystem], &SectionId))
SettingValue[0] = ANSI_NULL;
SectionName = OperatingSystemSectionNames[SelectedOperatingSystem];
if (IniOpenSection(SectionName, &SectionId))
{
sprintf(SettingName, "Section [%s] not found in freeldr.ini.", OperatingSystemSectionNames[SelectedOperatingSystem]);
UiMessageBox(SettingName);
continue;
// Try to read the boot type
IniReadSettingByName(SectionId, "BootType", SettingValue, sizeof(SettingValue));
}
// Try to read the boot type
if (!IniReadSettingByName(SectionId, "BootType", SettingValue, sizeof(SettingValue)))
if (SettingValue[0] == ANSI_NULL && SectionName[0] != ANSI_NULL)
{
sprintf(SettingName, "BootType= line not found in section [%s] in freeldr.ini.", OperatingSystemSectionNames[SelectedOperatingSystem]);
UiMessageBox(SettingName);
continue;
// Try to infere boot type value
#ifdef __i386__
CHAR LastChar;
LastChar = SectionName[strlen(SectionName) - 1];
if (LastChar == '\\' ||
(strstr(SectionName, ")partition(") != NULL &&
strstr(SectionName, ")partition(0)") == NULL))
{
strcpy(SettingValue, "Partition");
}
else if (LastChar == ')' || LastChar == ':')
{
strcpy(SettingValue, "Drive");
}
else if (TRUE)
{
strcpy(SettingValue, "BootSector");
}
else
#endif
{
strcpy(SettingValue, "Windows2003");
}
}
// Install the drive mapper according to this sections drive mappings
#ifdef __i386__
DriveMapMapDrivesInSection(OperatingSystemSectionNames[SelectedOperatingSystem]);
DriveMapMapDrivesInSection(SectionName);
#endif
if (_stricmp(SettingValue, "ReactOS") == 0)
{
LoadAndBootReactOS(OperatingSystemSectionNames[SelectedOperatingSystem]);
LoadAndBootReactOS(SectionName);
}
#ifdef FREELDR_REACTOS_SETUP
else if (_stricmp(SettingValue, "ReactOSSetup") == 0)
@@ -136,27 +156,27 @@ VOID RunLoader(VOID)
#ifdef __i386__
else if (_stricmp(SettingValue, "WindowsNT40") == 0)
{
LoadAndBootWindows(OperatingSystemSectionNames[SelectedOperatingSystem], _WIN32_WINNT_NT4);
LoadAndBootWindows(SectionName, _WIN32_WINNT_NT4);
}
else if (_stricmp(SettingValue, "Windows2003") == 0)
{
LoadAndBootWindows(OperatingSystemSectionNames[SelectedOperatingSystem], _WIN32_WINNT_WS03);
LoadAndBootWindows(SectionName, _WIN32_WINNT_WS03);
}
else if (_stricmp(SettingValue, "Linux") == 0)
{
LoadAndBootLinux(OperatingSystemSectionNames[SelectedOperatingSystem], OperatingSystemDisplayNames[SelectedOperatingSystem]);
LoadAndBootLinux(SectionName, OperatingSystemDisplayNames[SelectedOperatingSystem]);
}
else if (_stricmp(SettingValue, "BootSector") == 0)
{
LoadAndBootBootSector(OperatingSystemSectionNames[SelectedOperatingSystem]);
LoadAndBootBootSector(SectionName);
}
else if (_stricmp(SettingValue, "Partition") == 0)
{
LoadAndBootPartition(OperatingSystemSectionNames[SelectedOperatingSystem]);
LoadAndBootPartition(SectionName);
}
else if (_stricmp(SettingValue, "Drive") == 0)
{
LoadAndBootDrive(OperatingSystemSectionNames[SelectedOperatingSystem]);
LoadAndBootDrive(SectionName);
}
#endif
}
+21 -1
View File
@@ -1,6 +1,7 @@
/*
* FreeLoader
* Copyright (C) 1998-2003 Brian Palmer <[email protected]>
* Copyright (C) 2009 Hervé Poussineau
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -598,6 +599,7 @@ BOOLEAN FatSearchDirectoryBufferForFile(PFAT_VOLUME_INFO Volume, PVOID Directory
//
// We found the entry, now fill in the FAT_FILE_INFO struct
//
FatFileInfoPointer->Attributes = DirEntry->Attr;
FatFileInfoPointer->FileSize = DirEntry->Size;
FatFileInfoPointer->FilePointer = 0;
@@ -791,6 +793,14 @@ LONG FatLookupFile(PFAT_VOLUME_INFO Volume, PCSTR FileName, ULONG DeviceId, PFAT
//
if ((i+1) < NumberOfPathParts)
{
//
// Check if current entry is a directory
//
if (!(FatFileInfo.Attributes & ATTR_DIRECTORY))
{
MmFreeMemory(FatFileInfo.FileFatChain);
return ENOTDIR;
}
DirectoryStartCluster = FatFileInfo.FileFatChain[0];
}
MmFreeMemory(FatFileInfo.FileFatChain);
@@ -1347,9 +1357,10 @@ LONG FatOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
FAT_FILE_INFO TempFileInfo;
PFAT_FILE_INFO FileHandle;
ULONG DeviceId;
BOOLEAN IsDirectory;
LONG ret;
if (OpenMode != OpenReadOnly)
if (OpenMode != OpenReadOnly && OpenMode != OpenDirectory)
return EACCES;
DeviceId = FsGetDeviceId(*FileId);
@@ -1362,6 +1373,15 @@ LONG FatOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
if (ret != ESUCCESS)
return ENOENT;
//
// Check if caller opened what he expected (dir vs file)
//
IsDirectory = (TempFileInfo.Attributes & ATTR_DIRECTORY) != 0;
if (IsDirectory && OpenMode != OpenDirectory)
return EISDIR;
else if (!IsDirectory && OpenMode != OpenReadOnly)
return ENOTDIR;
FileHandle = MmHeapAlloc(sizeof(FAT_FILE_INFO));
if (!FileHandle)
return ENOMEM;
@@ -148,6 +148,7 @@ typedef struct _FAT_VOLUME_INFO *PFAT_VOLUME_INFO;
typedef struct
{
UCHAR Attributes; /* File attributes */
ULONG FileSize; /* File size */
ULONG FilePointer; /* File pointer */
ULONG* FileFatChain; /* File fat chain array */
+7 -36
View File
@@ -27,7 +27,6 @@ BOOLEAN InitOperatingSystemList(PCSTR **SectionNamesPointer, PCSTR **DisplayName
CHAR SettingValue[260];
ULONG OperatingSystemCount;
ULONG_PTR SectionId;
ULONG_PTR OperatingSystemSectionId;
ULONG SectionSettingCount;
PCHAR *OperatingSystemSectionNames;
PCHAR *OperatingSystemDisplayNames;
@@ -60,17 +59,14 @@ BOOLEAN InitOperatingSystemList(PCSTR **SectionNamesPointer, PCSTR **DisplayName
{
IniReadSettingByNumber(SectionId, Idx, SettingName, sizeof(SettingName), SettingValue, sizeof(SettingValue));
if (IniOpenSection(SettingName, &OperatingSystemSectionId))
{
// Copy the section name
strcpy(OperatingSystemSectionNames[CurrentOperatingSystemIndex], SettingName);
// Copy the section name
strcpy(OperatingSystemSectionNames[CurrentOperatingSystemIndex], SettingName);
// Copy the display name
RemoveQuotes(SettingValue);
strcpy(OperatingSystemDisplayNames[CurrentOperatingSystemIndex], SettingValue);
// Copy the display name
RemoveQuotes(SettingValue);
strcpy(OperatingSystemDisplayNames[CurrentOperatingSystemIndex], SettingValue);
CurrentOperatingSystemIndex++;
}
CurrentOperatingSystemIndex++;
}
*OperatingSystemCountPointer = OperatingSystemCount;
@@ -82,32 +78,7 @@ BOOLEAN InitOperatingSystemList(PCSTR **SectionNamesPointer, PCSTR **DisplayName
ULONG CountOperatingSystems(ULONG SectionId)
{
ULONG Idx;
CHAR SettingName[260];
CHAR SettingValue[260];
ULONG OperatingSystemCount = 0;
ULONG SectionSettingCount;
//
// Loop through and count the operating systems
//
SectionSettingCount = IniGetNumSectionItems(SectionId);
for (Idx=0; Idx<SectionSettingCount; Idx++)
{
IniReadSettingByNumber(SectionId, Idx, SettingName, sizeof(SettingName), SettingValue, sizeof(SettingValue));
if (IniOpenSection(SettingName, NULL))
{
OperatingSystemCount++;
}
else
{
sprintf(SettingName, "Operating System '%s' is listed in\nfreeldr.ini but doesn't have a [section].", SettingValue);
UiMessageBox(SettingName);
}
}
return OperatingSystemCount;
return IniGetNumSectionItems(SectionId);
}
BOOLEAN AllocateListMemory(PCHAR **SectionNamesPointer, PCHAR **DisplayNamesPointer, ULONG OperatingSystemCount)
-2
View File
@@ -412,8 +412,6 @@ VOID UiShowMessageBoxesInSection(PCSTR SectionName)
if (!IniOpenSection(SectionName, &SectionId))
{
sprintf(SettingName, "Section %s not found in freeldr.ini.\n", SectionName);
UiMessageBox(SettingName);
return;
}
@@ -919,7 +919,7 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss)
Ke386SetLocalDescriptorTable(Ldt);
// Load TSR
Ke386SetTr(0x28);
Ke386SetTr(KGDT_TSS);
// Clear GS
Ke386SetGs(0);
+2 -2
View File
@@ -363,10 +363,10 @@ ApplyTheme(GLOBALS* g)
*/
g->Theme.Effects.bTooltipAnimation = g->Theme.Effects.bMenuAnimation;
g->Theme.Effects.bTooltipFade = g->Theme.Effects.bMenuFade;
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, (PVOID)&g->Theme.Effects.bDragFullWindows, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, g->Theme.Effects.bDragFullWindows, NULL, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
//UPDATE_USERPREF(KEYBOARDCUES, &g->Theme.Effects.bKeyboardCues);
//UPDATE_USERPREF(ACTIVEWINDOWTRACKING, &g->Theme.Effects.bActiveWindowTracking);
UPDATE_USERPREF(MENUANIMATION, &g->Theme.Effects.bMenuAnimation);
//UPDATE_USERPREF(MENUANIMATION, &g->Theme.Effects.bMenuAnimation);
//UPDATE_USERPREF(COMBOBOXANIMATION, &g->Theme.Effects.bComboBoxAnimation);
//UPDATE_USERPREF(LISTBOXSMOOTHSCROLLING, &g->Theme.Effects.bListBoxSmoothScrolling);
//UPDATE_USERPREF(GRADIENTCAPTIONS, &g->Theme.Effects.bGradientCaptions);
-4
View File
@@ -28,10 +28,6 @@ typedef BOOL
ULONG ul_reason_for_call,
LPVOID lpReserved);
#if defined(KDBG) || DBG
VOID
LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule);
#endif
extern HANDLE WindowsApiPort;
/* EOF */
-12
View File
@@ -428,12 +428,6 @@ LdrpInit2(PCONTEXT Context,
InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
&NtModule->InInitializationOrderLinks);
#if DBG || defined(KDBG)
LdrpLoadUserModuleSymbols(NtModule);
#endif /* DBG || KDBG */
/* add entry for executable (becomes first list entry) */
ExeModule = (PLDR_DATA_TABLE_ENTRY)
RtlAllocateHeap(Peb->ProcessHeap,
@@ -478,12 +472,6 @@ LdrpInit2(PCONTEXT Context,
LdrpInitLoader();
#if DBG || defined(KDBG)
LdrpLoadUserModuleSymbols(ExeModule);
#endif /* DBG || KDBG */
EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
ExeModule->EntryPoint = EntryPoint;
+1 -19
View File
@@ -63,22 +63,6 @@ static VOID LdrpDetachProcess(BOOLEAN UnloadAll);
/* FUNCTIONS *****************************************************************/
#if DBG || defined(KDBG)
VOID
LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule)
{
NtSystemDebugControl(
SysDbgQueryVersion,
(PVOID)LdrModule,
0,
NULL,
0,
NULL);
}
#endif /* DBG || KDBG */
BOOLEAN
LdrMappedAsDataFile(PVOID *BaseAddress)
{
@@ -2269,9 +2253,7 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
DPRINT1("LdrFixupImports failed for %wZ, status=%x\n", &(*Module)->BaseDllName, Status);
return Status;
}
#if DBG || defined(KDBG)
LdrpLoadUserModuleSymbols(*Module);
#endif /* DBG || KDBG */
RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
InsertTailList(&NtCurrentPeb()->Ldr->InInitializationOrderModuleList,
&(*Module)->InInitializationOrderLinks);
+6
View File
@@ -3272,6 +3272,9 @@ RegOpenKeyA(HKEY hKey,
TRACE("RegOpenKeyA hKey 0x%x lpSubKey %s phkResult %p\n",
hKey, lpSubKey, phkResult);
if (!phkResult)
return ERROR_INVALID_PARAMETER;
if (!hKey && lpSubKey && phkResult)
{
return ERROR_INVALID_HANDLE;
@@ -3308,6 +3311,9 @@ RegOpenKeyW(HKEY hKey,
TRACE("RegOpenKeyW hKey 0x%x lpSubKey %S phkResult %p\n",
hKey, lpSubKey, phkResult);
if (!phkResult)
return ERROR_INVALID_PARAMETER;
if (!hKey && lpSubKey && phkResult)
{
return ERROR_INVALID_HANDLE;
+84 -62
View File
@@ -911,55 +911,63 @@ static DWORD mac_delete_credential(LPCWSTR TargetName)
}
#endif
static void convert_PCREDENTIALW_to_PCREDENTIALA(const CREDENTIALW *CredentialW, PCREDENTIALA CredentialA, DWORD *len)
static INT convert_PCREDENTIALW_to_PCREDENTIALA(const CREDENTIALW *CredentialW, PCREDENTIALA CredentialA, INT len)
{
char *buffer = (char *)CredentialA + sizeof(CREDENTIALA);
char *buffer;
INT string_len;
INT needed = sizeof(CREDENTIALA);
*len += sizeof(CREDENTIALA);
if (!CredentialA)
{
if (CredentialW->TargetName) *len += WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetName, -1, NULL, 0, NULL, NULL);
if (CredentialW->Comment) *len += WideCharToMultiByte(CP_ACP, 0, CredentialW->Comment, -1, NULL, 0, NULL, NULL);
*len += CredentialW->CredentialBlobSize;
if (CredentialW->TargetAlias) *len += WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetAlias, -1, NULL, 0, NULL, NULL);
if (CredentialW->UserName) *len += WideCharToMultiByte(CP_ACP, 0, CredentialW->UserName, -1, NULL, 0, NULL, NULL);
if (CredentialW->TargetName)
needed += WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetName, -1, NULL, 0, NULL, NULL);
if (CredentialW->Comment)
needed += WideCharToMultiByte(CP_ACP, 0, CredentialW->Comment, -1, NULL, 0, NULL, NULL);
needed += CredentialW->CredentialBlobSize;
if (CredentialW->TargetAlias)
needed += WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetAlias, -1, NULL, 0, NULL, NULL);
if (CredentialW->UserName)
needed += WideCharToMultiByte(CP_ACP, 0, CredentialW->UserName, -1, NULL, 0, NULL, NULL);
return;
return needed;
}
buffer = (char *)CredentialA + sizeof(CREDENTIALA);
len -= sizeof(CREDENTIALA);
CredentialA->Flags = CredentialW->Flags;
CredentialA->Type = CredentialW->Type;
if (CredentialW->TargetName)
{
CredentialA->TargetName = buffer;
/* Buffer is guaranteed to be large enough */
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetName, -1, CredentialA->TargetName, 0x7FFFFFFF, NULL, NULL);
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetName, -1, buffer, len, NULL, NULL);
buffer += string_len;
*len += string_len;
needed += string_len;
len -= string_len;
}
else
CredentialA->TargetName = NULL;
if (CredentialW->Comment)
{
CredentialA->Comment = buffer;
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->Comment, -1, CredentialA->Comment, 0x7FFFFFFF, NULL, NULL);
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->Comment, -1, buffer, len, NULL, NULL);
buffer += string_len;
*len += string_len;
needed += string_len;
len -= string_len;
}
else
CredentialA->Comment = NULL;
CredentialA->LastWritten = CredentialW->LastWritten;
CredentialA->CredentialBlobSize = CredentialW->CredentialBlobSize;
if (CredentialW->CredentialBlobSize)
if (CredentialW->CredentialBlobSize && (CredentialW->CredentialBlobSize <= len))
{
CredentialA->CredentialBlob =(LPBYTE)buffer;
memcpy(CredentialA->CredentialBlob, CredentialW->CredentialBlob,
CredentialW->CredentialBlobSize);
buffer += CredentialW->CredentialBlobSize;
*len += CredentialW->CredentialBlobSize;
needed += CredentialW->CredentialBlobSize;
len -= CredentialW->CredentialBlobSize;
}
else
CredentialA->CredentialBlob = NULL;
@@ -969,57 +977,67 @@ static void convert_PCREDENTIALW_to_PCREDENTIALA(const CREDENTIALW *CredentialW,
if (CredentialW->TargetAlias)
{
CredentialA->TargetAlias = buffer;
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetAlias, -1, CredentialA->TargetAlias, 0x7FFFFFFF, NULL, NULL);
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->TargetAlias, -1, buffer, len, NULL, NULL);
buffer += string_len;
*len += string_len;
needed += string_len;
len -= string_len;
}
else
CredentialA->TargetAlias = NULL;
if (CredentialW->UserName)
{
CredentialA->UserName = buffer;
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->UserName, -1, CredentialA->UserName, 0x7FFFFFFF, NULL, NULL);
buffer += string_len;
*len += string_len;
string_len = WideCharToMultiByte(CP_ACP, 0, CredentialW->UserName, -1, buffer, len, NULL, NULL);
needed += string_len;
}
else
CredentialA->UserName = NULL;
return needed;
}
static void convert_PCREDENTIALA_to_PCREDENTIALW(const CREDENTIALA *CredentialA, PCREDENTIALW CredentialW, DWORD *len)
static INT convert_PCREDENTIALA_to_PCREDENTIALW(const CREDENTIALA *CredentialA, PCREDENTIALW CredentialW, INT len)
{
char *buffer = (char *)CredentialW + sizeof(CREDENTIALW);
char *buffer;
INT string_len;
INT needed = sizeof(CREDENTIALW);
*len += sizeof(CREDENTIALW);
if (!CredentialW)
{
if (CredentialA->TargetName) *len += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetName, -1, NULL, 0);
if (CredentialA->Comment) *len += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->Comment, -1, NULL, 0);
*len += CredentialA->CredentialBlobSize;
if (CredentialA->TargetAlias) *len += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetAlias, -1, NULL, 0);
if (CredentialA->UserName) *len += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->UserName, -1, NULL, 0);
if (CredentialA->TargetName)
needed += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetName, -1, NULL, 0);
if (CredentialA->Comment)
needed += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->Comment, -1, NULL, 0);
needed += CredentialA->CredentialBlobSize;
if (CredentialA->TargetAlias)
needed += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetAlias, -1, NULL, 0);
if (CredentialA->UserName)
needed += sizeof(WCHAR) * MultiByteToWideChar(CP_ACP, 0, CredentialA->UserName, -1, NULL, 0);
return;
return needed;
}
buffer = (char *)CredentialW + sizeof(CREDENTIALW);
len -= sizeof(CREDENTIALW);
CredentialW->Flags = CredentialA->Flags;
CredentialW->Type = CredentialA->Type;
if (CredentialA->TargetName)
{
CredentialW->TargetName = (LPWSTR)buffer;
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetName, -1, CredentialW->TargetName, 0x7FFFFFFF);
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetName, -1, CredentialW->TargetName, len / sizeof(WCHAR));
buffer += sizeof(WCHAR) * string_len;
*len += sizeof(WCHAR) * string_len;
needed += sizeof(WCHAR) * string_len;
len -= sizeof(WCHAR) * string_len;
}
else
CredentialW->TargetName = NULL;
if (CredentialA->Comment)
{
CredentialW->Comment = (LPWSTR)buffer;
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->Comment, -1, CredentialW->Comment, 0x7FFFFFFF);
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->Comment, -1, CredentialW->Comment, len / sizeof(WCHAR));
buffer += sizeof(WCHAR) * string_len;
*len += sizeof(WCHAR) * string_len;
needed += sizeof(WCHAR) * string_len;
len -= sizeof(WCHAR) * string_len;
}
else
CredentialW->Comment = NULL;
@@ -1031,7 +1049,8 @@ static void convert_PCREDENTIALA_to_PCREDENTIALW(const CREDENTIALA *CredentialA,
memcpy(CredentialW->CredentialBlob, CredentialA->CredentialBlob,
CredentialA->CredentialBlobSize);
buffer += CredentialA->CredentialBlobSize;
*len += CredentialA->CredentialBlobSize;
needed += CredentialA->CredentialBlobSize;
len -= CredentialA->CredentialBlobSize;
}
else
CredentialW->CredentialBlob = NULL;
@@ -1041,21 +1060,23 @@ static void convert_PCREDENTIALA_to_PCREDENTIALW(const CREDENTIALA *CredentialA,
if (CredentialA->TargetAlias)
{
CredentialW->TargetAlias = (LPWSTR)buffer;
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetAlias, -1, CredentialW->TargetAlias, 0x7FFFFFFF);
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->TargetAlias, -1, CredentialW->TargetAlias, len / sizeof(WCHAR));
buffer += sizeof(WCHAR) * string_len;
*len += sizeof(WCHAR) * string_len;
needed += sizeof(WCHAR) * string_len;
len -= sizeof(WCHAR) * string_len;
}
else
CredentialW->TargetAlias = NULL;
if (CredentialA->UserName)
{
CredentialW->UserName = (LPWSTR)buffer;
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->UserName, -1, CredentialW->UserName, 0x7FFFFFFF);
buffer += sizeof(WCHAR) * string_len;
*len += sizeof(WCHAR) * string_len;
string_len = MultiByteToWideChar(CP_ACP, 0, CredentialA->UserName, -1, CredentialW->UserName, len / sizeof(WCHAR));
needed += sizeof(WCHAR) * string_len;
}
else
CredentialW->UserName = NULL;
return needed;
}
/******************************************************************************
@@ -1161,7 +1182,8 @@ BOOL WINAPI CredEnumerateA(LPCSTR Filter, DWORD Flags, DWORD *Count,
LPWSTR FilterW;
PCREDENTIALW *CredentialsW;
DWORD i;
DWORD len;
INT len;
INT needed;
char *buffer;
TRACE("(%s, 0x%x, %p, %p)\n", debugstr_a(Filter), Flags, Count, Credentials);
@@ -1189,7 +1211,7 @@ BOOL WINAPI CredEnumerateA(LPCSTR Filter, DWORD Flags, DWORD *Count,
len = *Count * sizeof(PCREDENTIALA);
for (i = 0; i < *Count; i++)
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, &len);
len += convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, 0);
*Credentials = HeapAlloc(GetProcessHeap(), 0, len);
if (!*Credentials)
@@ -1200,12 +1222,13 @@ BOOL WINAPI CredEnumerateA(LPCSTR Filter, DWORD Flags, DWORD *Count,
}
buffer = (char *)&(*Credentials)[*Count];
len -= *Count * sizeof(PCREDENTIALA);
for (i = 0; i < *Count; i++)
{
len = 0;
(*Credentials)[i] = (PCREDENTIALA)buffer;
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], &len);
buffer += len;
needed = convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], len);
buffer += needed;
len -= needed;
}
CredFree(CredentialsW);
@@ -1334,7 +1357,7 @@ BOOL WINAPI CredReadA(LPCSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALA *
{
LPWSTR TargetNameW;
PCREDENTIALW CredentialW;
DWORD len;
INT len;
TRACE("(%s, %d, 0x%x, %p)\n", debugstr_a(TargetName), Type, Flags, Credential);
@@ -1360,16 +1383,14 @@ BOOL WINAPI CredReadA(LPCSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALA *
}
HeapFree(GetProcessHeap(), 0, TargetNameW);
len = 0;
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialW, NULL, &len);
len = convert_PCREDENTIALW_to_PCREDENTIALA(CredentialW, NULL, 0);
*Credential = HeapAlloc(GetProcessHeap(), 0, len);
if (!*Credential)
{
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
len = 0;
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialW, *Credential, &len);
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialW, *Credential, len);
CredFree(CredentialW);
@@ -1540,7 +1561,7 @@ BOOL WINAPI CredReadW(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW
BOOL WINAPI CredWriteA(PCREDENTIALA Credential, DWORD Flags)
{
BOOL ret;
DWORD len;
INT len;
PCREDENTIALW CredentialW;
TRACE("(%p, 0x%x)\n", Credential, Flags);
@@ -1551,16 +1572,15 @@ BOOL WINAPI CredWriteA(PCREDENTIALA Credential, DWORD Flags)
return FALSE;
}
len = 0;
convert_PCREDENTIALA_to_PCREDENTIALW(Credential, NULL, &len);
len = convert_PCREDENTIALA_to_PCREDENTIALW(Credential, NULL, 0);
CredentialW = HeapAlloc(GetProcessHeap(), 0, len);
if (!CredentialW)
{
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
len = 0;
convert_PCREDENTIALA_to_PCREDENTIALW(Credential, CredentialW, &len);
convert_PCREDENTIALA_to_PCREDENTIALW(Credential, CredentialW, len);
ret = CredWriteW(CredentialW, Flags);
@@ -1722,7 +1742,7 @@ BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInf
DWORD Flags, DWORD *Size, PCREDENTIALA **Credentials)
{
PCREDENTIAL_TARGET_INFORMATIONW TargetInformationW;
DWORD len, i;
INT len, i;
WCHAR *buffer, *end;
BOOL ret;
PCREDENTIALW* CredentialsW;
@@ -1831,10 +1851,11 @@ BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInf
if (ret)
{
char *buf;
INT needed;
len = *Size * sizeof(PCREDENTIALA);
for (i = 0; i < *Size; i++)
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, &len);
len += convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, 0);
*Credentials = HeapAlloc(GetProcessHeap(), 0, len);
if (!*Credentials)
@@ -1845,12 +1866,13 @@ BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInf
}
buf = (char *)&(*Credentials)[*Size];
len -= *Size * sizeof(PCREDENTIALA);
for (i = 0; i < *Size; i++)
{
len = 0;
(*Credentials)[i] = (PCREDENTIALA)buf;
convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], &len);
buf += len;
needed = convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], len);
buf += needed;
len -= needed;
}
CredFree(CredentialsW);
+12 -12
View File
@@ -152,18 +152,18 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
51 BITMAP "res/bavarian/GrasOber.bmp"
52 BITMAP "res/bavarian/GrasKoenig.bmp"
53 BITMAP "res/bavarian/FreeCard.bmp"
54 BITMAP "res/bavarian/Ruecken.bmp"
55 BITMAP "res/bavarian/Ruecken.bmp"
56 BITMAP "res/bavarian/Ruecken.bmp"
57 BITMAP "res/bavarian/Ruecken.bmp"
58 BITMAP "res/bavarian/Ruecken.bmp"
59 BITMAP "res/bavarian/Ruecken.bmp"
60 BITMAP "res/bavarian/Ruecken.bmp"
61 BITMAP "res/bavarian/Ruecken.bmp"
62 BITMAP "res/bavarian/Ruecken.bmp"
63 BITMAP "res/bavarian/Ruecken.bmp"
64 BITMAP "res/bavarian/Ruecken.bmp"
65 BITMAP "res/bavarian/Ruecken.bmp"
54 BITMAP "res/bavarian/Ruecken1.bmp"
55 BITMAP "res/bavarian/Ruecken2.bmp"
56 BITMAP "res/bavarian/Ruecken3.bmp"
57 BITMAP "res/bavarian/Ruecken4.bmp"
58 BITMAP "res/bavarian/Ruecken5.bmp"
59 BITMAP "res/bavarian/Ruecken6.bmp"
60 BITMAP "res/bavarian/Ruecken7.bmp"
61 BITMAP "res/bavarian/Ruecken8.bmp"
62 BITMAP "res/bavarian/Ruecken9.bmp"
63 BITMAP "res/bavarian/Ruecken10.bmp"
64 BITMAP "res/bavarian/Ruecken11.bmp"
65 BITMAP "res/bavarian/Ruecken12.bmp"
66 BITMAP "res/bavarian/Joker.bmp"
67 BITMAP "res/bavarian/XSign.bmp"
68 BITMAP "res/bavarian/OSign.bmp"

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

+4
View File
@@ -916,6 +916,10 @@ GetGlyphIndicesA(
INT countW;
lpstrW = FONT_mbtowc(hdc, lpstr, count, &countW, NULL);
if (lpstrW == NULL)
return GDI_ERROR;
Ret = NtGdiGetGlyphIndicesW(hdc, lpstrW, countW, pgi, flags);
HeapFree(GetProcessHeap(), 0, lpstrW);
return Ret;
+2 -8
View File
@@ -171,9 +171,6 @@ IsBadStringPtrW(IN LPCWSTR lpsz,
/* Calculate the last page */
Last = (PWCHAR)((ULONG_PTR)lpsz + (ucchMax * 2) - 2);
/* Another quick failure case */
if ((ULONG_PTR)Last < (ULONG_PTR)lpsz) return TRUE;
/* Enter SEH */
_SEH2_TRY
{
@@ -184,7 +181,7 @@ IsBadStringPtrW(IN LPCWSTR lpsz,
{
Char = *Current;
Current++;
} while (Char && (Current <= Last));
} while (Char && (Current != Last + 1));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@@ -217,9 +214,6 @@ IsBadStringPtrA(IN LPCSTR lpsz,
/* Calculate the last page */
Last = (PCHAR)((ULONG_PTR)lpsz + ucchMax - 1);
/* Another quick failure case */
if ((ULONG_PTR)Last < (ULONG_PTR)lpsz) return TRUE;
/* Enter SEH */
_SEH2_TRY
{
@@ -230,7 +224,7 @@ IsBadStringPtrA(IN LPCSTR lpsz,
{
Char = *Current;
Current++;
} while (Char && (Current <= Last));
} while (Char && (Current != Last + 1));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
+12 -10
View File
@@ -170,14 +170,15 @@ NTAPI
VirtualLock(IN LPVOID lpAddress,
IN SIZE_T dwSize)
{
ULONG BytesLocked;
NTSTATUS Status;
ULONG RegionSize = dwSize;
PVOID BaseAddress = lpAddress;
/* Lock the memory */
Status = NtLockVirtualMemory(NtCurrentProcess(),
lpAddress,
dwSize,
&BytesLocked);
&BaseAddress,
&RegionSize,
MAP_PROCESS);
if (!NT_SUCCESS(Status))
{
/* We failed */
@@ -244,14 +245,15 @@ NTAPI
VirtualUnlock(IN LPVOID lpAddress,
IN SIZE_T dwSize)
{
ULONG BytesLocked;
NTSTATUS Status;
/* Unlock the memory */
ULONG RegionSize = dwSize;
PVOID BaseAddress = lpAddress;
/* Lock the memory */
Status = NtUnlockVirtualMemory(NtCurrentProcess(),
lpAddress,
dwSize,
&BytesLocked);
&BaseAddress,
&RegionSize,
MAP_PROCESS);
if (!NT_SUCCESS(Status))
{
/* We failed */
+2
View File
@@ -259,6 +259,8 @@ BasepCreateStack(HANDLE hProcess,
/* Now set up some basic Initial TEB Parameters */
InitialTeb->AllocatedStackBase = (PVOID)Stack;
InitialTeb->StackBase = (PVOID)(Stack + StackReserve);
InitialTeb->PreviousStackBase = NULL;
InitialTeb->PreviousStackLimit = NULL;
/* Update the Stack Position */
Stack += StackReserve - StackCommit;
+21 -9
View File
@@ -501,7 +501,7 @@ static UINT msi_apply_substorage_transform( MSIPACKAGE *package,
return ERROR_SUCCESS;
}
static UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si )
UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si )
{
static const WCHAR szProdCode[] = { 'P','r','o','d','u','c','t','C','o','d','e',0 };
LPWSTR guid_list, *guids, product_code;
@@ -789,6 +789,9 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0};
static const WCHAR szAction[] = {'A','C','T','I','O','N',0};
static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0};
static const WCHAR szReinstall[] = {'R','E','I','N','S','T','A','L','L',0};
static const WCHAR szInstalled[] = {'I','n','s','t','a','l','l','e','d',0};
static const WCHAR szAll[] = {'A','L','L',0};
MSI_SetPropertyW(package, szAction, szInstall);
@@ -837,6 +840,12 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( package );
msi_apply_patches( package );
if (!szCommandLine && msi_get_property_int( package, szInstalled, 0 ))
{
TRACE("setting reinstall property\n");
MSI_SetPropertyW( package, szReinstall, szAll );
}
/* properties may have been added by a transform */
msi_clone_properties( package );
msi_set_context( package );
@@ -871,6 +880,9 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
/* finish up running custom actions */
ACTION_FinishCustomActions(package);
if (rc == ERROR_SUCCESS && package->need_reboot)
return ERROR_SUCCESS_REBOOT_REQUIRED;
return rc;
}
@@ -3378,16 +3390,12 @@ static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
return ERROR_SUCCESS;
res = CoInitialize( NULL );
if (FAILED (res))
{
ERR("CoInitialize failed\n");
return ERROR_FUNCTION_FAILED;
}
rc = MSI_IterateRecords(view, NULL, ITERATE_CreateShortcuts, package);
msiobj_release(&view->hdr);
CoUninitialize();
if (SUCCEEDED(res))
CoUninitialize();
return rc;
}
@@ -5308,8 +5316,7 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
}
}
if (!*flags ||
check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
if (check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETALWAYS) ||
check_flag_combo(*flags, ENV_ACT_SETABSENT | ENV_MOD_MASK))
@@ -5318,6 +5325,9 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
return ERROR_FUNCTION_FAILED;
}
if (!*flags)
*flags = ENV_ACT_SETALWAYS | ENV_ACT_REMOVE;
return ERROR_SUCCESS;
}
@@ -5345,6 +5355,8 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
name = MSI_RecordGetString(rec, 2);
value = MSI_RecordGetString(rec, 3);
TRACE("name %s value %s\n", debugstr_w(name), debugstr_w(value));
res = env_set_flags(&name, &value, &flags);
if (res != ERROR_SUCCESS)
goto done;
+5 -4
View File
@@ -679,7 +679,7 @@ static DWORD ACTION_CallDllFunction( const GUID *guid )
hModule = LoadLibraryW( dll );
if (!hModule)
{
ERR("failed to load dll %s\n", debugstr_w( dll ) );
ERR("failed to load dll %s (%u)\n", debugstr_w( dll ), GetLastError() );
return r;
}
@@ -1046,15 +1046,16 @@ static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source,
if( row )
{
LPCWSTR error = MSI_RecordGetString( row, 1 );
MessageBoxW( NULL, error, NULL, MB_OK );
if ((gUILevel & INSTALLUILEVEL_MASK) != INSTALLUILEVEL_NONE)
MessageBoxW( NULL, error, NULL, MB_OK );
msiobj_release( &row->hdr );
}
else
else if ((gUILevel & INSTALLUILEVEL_MASK) != INSTALLUILEVEL_NONE)
MessageBoxW( NULL, deformated, NULL, MB_OK );
msi_free( deformated );
return ERROR_FUNCTION_FAILED;
return ERROR_INSTALL_FAILURE;
}
static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
+36 -3
View File
@@ -139,7 +139,7 @@ static UINT copy_file(MSIFILE *file, LPWSTR source)
return ERROR_SUCCESS;
}
static UINT copy_install_file(MSIFILE *file, LPWSTR source)
static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
{
UINT gle;
@@ -153,7 +153,7 @@ static UINT copy_install_file(MSIFILE *file, LPWSTR source)
if (gle == ERROR_ALREADY_EXISTS && file->state == msifs_overwrite)
{
TRACE("overwriting existing file\n");
gle = ERROR_SUCCESS;
return ERROR_SUCCESS;
}
else if (gle == ERROR_ACCESS_DENIED)
{
@@ -162,6 +162,39 @@ static UINT copy_install_file(MSIFILE *file, LPWSTR source)
gle = copy_file(file, source);
TRACE("Overwriting existing file: %d\n", gle);
}
if (gle == ERROR_SHARING_VIOLATION)
{
static const WCHAR msiW[] = {'m','s','i',0};
static const WCHAR slashW[] = {'\\',0};
WCHAR tmpfileW[MAX_PATH], *pathW, *p;
DWORD len;
TRACE("file in use, scheduling rename operation\n");
GetTempFileNameW(slashW, msiW, 0, tmpfileW);
len = strlenW(file->TargetPath) + strlenW(tmpfileW) + 1;
if (!(pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(pathW, file->TargetPath);
if ((p = strrchrW(pathW, '\\'))) *p = 0;
strcatW(pathW, tmpfileW);
if (CopyFileW(source, pathW, FALSE) &&
MoveFileExW(file->TargetPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) &&
MoveFileExW(pathW, file->TargetPath, MOVEFILE_DELAY_UNTIL_REBOOT))
{
file->state = msifs_installed;
package->need_reboot = 1;
gle = ERROR_SUCCESS;
}
else
{
gle = GetLastError();
WARN("failed to schedule rename operation: %d)\n", gle);
}
HeapFree(GetProcessHeap(), 0, pathW);
}
return gle;
}
@@ -296,7 +329,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
debugstr_w(file->TargetPath));
msi_file_update_ui(package, file, szInstallFiles);
rc = copy_install_file(file, source);
rc = copy_install_file(package, file, source);
if (rc != ERROR_SUCCESS)
{
ERR("Failed to copy %s to %s (%d)\n", debugstr_w(source),
+68 -11
View File
@@ -49,11 +49,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi);
#define _O_TEXT 0x4000
#define _O_BINARY 0x8000
static BOOL source_matches_volume(MSIMEDIAINFO *mi, LPWSTR source_root)
static BOOL source_matches_volume(MSIMEDIAINFO *mi, LPCWSTR source_root)
{
WCHAR volume_name[MAX_PATH + 1];
WCHAR root[MAX_PATH + 1];
if (!GetVolumeInformationW(source_root, volume_name, MAX_PATH + 1,
strcpyW(root, source_root);
PathStripToRootW(root);
PathAddBackslashW(root);
if (!GetVolumeInformationW(root, volume_name, MAX_PATH + 1,
NULL, NULL, NULL, NULL, 0))
{
ERR("Failed to get volume information\n");
@@ -80,7 +85,6 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
error = generate_error_string(package, 1302, 1, mi->disk_prompt);
error_dialog = msi_dup_property(package, error_prop);
source_dir = msi_dup_property(package, cszSourceDir);
PathStripToRootW(source_dir);
while (r == ERROR_SUCCESS &&
!source_matches_volume(mi, source_dir))
@@ -333,11 +337,56 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint,
NULL, CREATE_ALWAYS, attrs, NULL);
if (handle == INVALID_HANDLE_VALUE)
{
if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES)
ERR("failed to create %s (error %d)\n",
debugstr_w(path), GetLastError());
DWORD err = GetLastError();
DWORD attrs2 = GetFileAttributesW(path);
goto done;
if (attrs2 == INVALID_FILE_ATTRIBUTES)
{
ERR("failed to create %s (error %d)\n", debugstr_w(path), err);
goto done;
}
else if (err == ERROR_ACCESS_DENIED && (attrs2 & FILE_ATTRIBUTE_READONLY))
{
TRACE("removing read-only attribute on %s\n", debugstr_w(path));
SetFileAttributesW( path, attrs2 & ~FILE_ATTRIBUTE_READONLY );
handle = CreateFileW(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs2, NULL);
if (handle != INVALID_HANDLE_VALUE) goto done;
err = GetLastError();
}
if (err == ERROR_SHARING_VIOLATION)
{
static const WCHAR msiW[] = {'m','s','i',0};
static const WCHAR slashW[] = {'\\',0};
WCHAR tmpfileW[MAX_PATH], *tmppathW, *p;
DWORD len;
TRACE("file in use, scheduling rename operation\n");
GetTempFileNameW(slashW, msiW, 0, tmpfileW);
len = strlenW(path) + strlenW(tmpfileW) + 1;
if (!(tmppathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(tmppathW, path);
if ((p = strrchrW(tmppathW, '\\'))) *p = 0;
strcatW(tmppathW, tmpfileW);
handle = CreateFileW(tmppathW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL);
if (handle != INVALID_HANDLE_VALUE &&
MoveFileExW(path, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) &&
MoveFileExW(tmppathW, path, MOVEFILE_DELAY_UNTIL_REBOOT))
{
data->package->need_reboot = 1;
}
else
WARN("failed to schedule rename operation %s (error %d)\n", debugstr_w(path), GetLastError());
HeapFree(GetProcessHeap(), 0, tmppathW);
}
else
WARN("failed to create %s (error %d)\n", debugstr_w(path), err);
}
done:
@@ -455,6 +504,17 @@ void msi_free_media_info(MSIMEDIAINFO *mi)
msi_free(mi);
}
static UINT get_drive_type(const WCHAR *path)
{
WCHAR root[MAX_PATH + 1];
strcpyW(root, path);
PathStripToRootW(root);
PathAddBackslashW(root);
return GetDriveTypeW(root);
}
static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
{
MSIRECORD *row;
@@ -494,9 +554,7 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
source_dir = msi_dup_property(package, cszSourceDir);
lstrcpyW(mi->source, source_dir);
PathStripToRootW(source_dir);
mi->type = GetDriveTypeW(source_dir);
mi->type = get_drive_type(source_dir);
if (file->IsCompressed && mi->cabinet)
{
@@ -576,7 +634,6 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
{
/* FIXME: what about SourceDir */
lstrcpyW(mi->source, source);
lstrcatW(mi->source, mi->cabinet);
return ERROR_SUCCESS;
}
}
+76 -6
View File
@@ -489,13 +489,86 @@ UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath,
return ERROR_CALL_NOT_IMPLEMENTED;
}
static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
{
MSISUMMARYINFO *si;
MSIDATABASE *patch_db;
UINT r = ERROR_SUCCESS;
r = MSI_OpenDatabaseW( patch, MSIDBOPEN_READONLY, &patch_db );
if (r != ERROR_SUCCESS)
{
WARN("failed to open patch file %s\n", debugstr_w(patch));
return r;
}
si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
if (!si)
{
r = ERROR_FUNCTION_FAILED;
goto done;
}
r = msi_check_patch_applicable( package, si );
if (r != ERROR_SUCCESS)
TRACE("patch not applicable\n");
done:
msiobj_release( &patch_db->hdr );
msiobj_release( &si->hdr );
return r;
}
UINT WINAPI MsiDetermineApplicablePatchesW(LPCWSTR szProductPackagePath,
DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOW pPatchInfo)
{
FIXME("(%s, %d, %p): stub!\n", debugstr_w(szProductPackagePath),
cPatchInfo, pPatchInfo);
UINT i, r, ret = ERROR_FUNCTION_FAILED;
MSIPACKAGE *package;
return ERROR_CALL_NOT_IMPLEMENTED;
TRACE("(%s, %d, %p)\n", debugstr_w(szProductPackagePath), cPatchInfo, pPatchInfo);
r = MSI_OpenPackageW( szProductPackagePath, &package );
if (r != ERROR_SUCCESS)
{
ERR("failed to open package %u\n", r);
return r;
}
for (i = 0; i < cPatchInfo; i++)
{
switch (pPatchInfo[i].ePatchDataType)
{
case MSIPATCH_DATATYPE_PATCHFILE:
{
FIXME("patch ordering not supported\n");
r = MSI_ApplicablePatchW( package, pPatchInfo[i].szPatchData );
if (r != ERROR_SUCCESS)
{
pPatchInfo[i].dwOrder = ~0u;
pPatchInfo[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND;
}
else
{
pPatchInfo[i].dwOrder = i;
pPatchInfo[i].uStatus = ret = ERROR_SUCCESS;
}
break;
}
default:
{
FIXME("patch data type %u not supported\n", pPatchInfo[i].ePatchDataType);
pPatchInfo[i].dwOrder = ~0u;
pPatchInfo[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND;
break;
}
}
TRACE(" szPatchData: %s\n", debugstr_w(pPatchInfo[i].szPatchData));
TRACE("ePatchDataType: %u\n", pPatchInfo[i].ePatchDataType);
TRACE(" dwOrder: %u\n", pPatchInfo[i].dwOrder);
TRACE(" uStatus: %u\n", pPatchInfo[i].uStatus);
}
return ret;
}
UINT WINAPI MsiDeterminePatchSequenceA(LPCSTR szProductCode, LPCSTR szUserSid,
@@ -620,9 +693,6 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
if (szCommandLine)
lstrcpyW(commandline,szCommandLine);
if (MsiQueryProductStateW(szProduct) != INSTALLSTATE_UNKNOWN)
lstrcatW(commandline,szInstalled);
if (eInstallState == INSTALLSTATE_ABSENT)
lstrcatW(commandline, szRemoveAll);
+3
View File
@@ -340,6 +340,7 @@ typedef struct tagMSIPACKAGE
unsigned char scheduled_action_running : 1;
unsigned char commit_action_running : 1;
unsigned char rollback_action_running : 1;
unsigned char need_reboot : 1;
} MSIPACKAGE;
typedef struct tagMSIPREVIEW
@@ -683,6 +684,8 @@ extern UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
LPCWSTR szTransformFile, int iErrorCond );
extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg );
extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si );
/* action internals */
extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR );
extern void ACTION_free_package_structures( MSIPACKAGE* );
+1 -1
View File
@@ -424,4 +424,4 @@ library WindowsInstaller
properties:
methods:
}
}
}
+10 -4
View File
@@ -453,13 +453,14 @@ static VOID set_installer_properties(MSIPACKAGE *package)
static const WCHAR szTime[] = {'T','i','m','e',0};
static const WCHAR szUserLangID[] = {'U','s','e','r','L','a','n','g','u','a','g','e','I','D',0};
static const WCHAR szSystemLangID[] = {'S','y','s','t','e','m','L','a','n','g','u','a','g','e','I','D',0};
static const WCHAR szProductState[] = {'P','r','o','d','u','c','t','S','t','a','t','e',0};
/*
* Other things that probably should be set:
*
* ComputerName LogonUser VirtualMemory
* ShellAdvSupport DefaultUIFont PackagecodeChanging
* ProductState CaptionHeight BorderTop BorderSide TextHeight
* CaptionHeight BorderTop BorderSide TextHeight
* RedirectedDllSupport
*/
@@ -658,6 +659,9 @@ static VOID set_installer_properties(MSIPACKAGE *package)
sprintfW(bufstr, szIntFormat, langid);
MSI_SetPropertyW( package, szSystemLangID, bufstr );
sprintfW(bufstr, szIntFormat, MsiQueryProductStateW(package->ProductCode));
MSI_SetPropertyW( package, szProductState, bufstr );
}
static UINT msi_load_summary_properties( MSIPACKAGE *package )
@@ -804,12 +808,14 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
create_temp_property_table( package );
msi_clone_properties( package );
set_installer_properties(package);
sprintfW(uilevel,szpi,gUILevel);
MSI_SetPropertyW(package, szLevel, uilevel);
package->ProductCode = msi_dup_property( package, szProductCode );
set_installed_prop( package );
set_installer_properties( package );
sprintfW(uilevel,szpi,gUILevel);
MSI_SetPropertyW(package, szLevel, uilevel);
r = msi_load_summary_properties( package );
if (r != ERROR_SUCCESS)
{
+3 -1
View File
@@ -475,7 +475,9 @@ UINT WINAPI MsiGetSummaryInformationW( MSIHANDLE hDatabase,
if( szDatabase )
{
ret = MSI_OpenDatabaseW( szDatabase, NULL, &db );
LPCWSTR persist = uiUpdateCount ? MSIDBOPEN_TRANSACT : MSIDBOPEN_READONLY;
ret = MSI_OpenDatabaseW( szDatabase, persist, &db );
if( ret != ERROR_SUCCESS )
return ret;
}
+2 -2
View File
@@ -2777,7 +2777,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
r = TABLE_insert_row( &tv->view, rec, -1, FALSE );
if (r != ERROR_SUCCESS)
ERR("insert row failed\n");
WARN("insert row failed\n");
if ( number != MSI_NULL_INTEGER && !lstrcmpW(name, szColumns) )
msi_update_table_columns( db, table );
@@ -2788,7 +2788,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
r = msi_table_find_row( tv, rec, &row );
if (r != ERROR_SUCCESS)
ERR("no matching row to transform\n");
WARN("no matching row to transform\n");
else if ( mask )
{
TRACE("modifying row [%d]:\n", row);
+123
View File
@@ -0,0 +1,123 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
BOOLEAN
WINAPI
AcsHlpSendCommand(IN PAUTODIAL_COMMAND Command)
{
UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"\\Device\\RasAcd");
NTSTATUS Status;
HANDLE DriverHandle;
HANDLE EventHandle = NULL;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
/* Initialize the object attributes */
InitializeObjectAttributes(&ObjectAttributes,
&DriverName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
/* Open a handle to it */
Status = NtCreateFile(&DriverHandle,
FILE_READ_DATA | FILE_WRITE_DATA,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
0,
NULL,
0);
if (!NT_SUCCESS(Status)) return FALSE;
/* Create an event */
EventHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!EventHandle)
{
/* Event failed, fail us */
CloseHandle(DriverHandle);
return FALSE;
}
/* Connect to the driver */
Status = NtDeviceIoControlFile(DriverHandle,
EventHandle,
NULL,
NULL,
&IoStatusBlock,
IOCTL_ACD_CONNECT_ADDRESS,
Command,
sizeof(AUTODIAL_COMMAND),
NULL,
0);
/* Check if we need to wait */
if (Status == STATUS_PENDING)
{
/* Wait for the driver */
Status = WaitForSingleObject(EventHandle, INFINITE);
/* Update status */
Status = IoStatusBlock.Status;
}
/* Close handles and return */
CloseHandle(EventHandle);
CloseHandle(DriverHandle);
return NT_SUCCESS(Status);
}
/*
* @implemented
*/
BOOLEAN
WINAPI
AcsHlpAttemptConnection(IN PAUTODIAL_ADDR ConnectionAddress)
{
AUTODIAL_COMMAND Command;
/* Clear the command packet */
RtlZeroMemory(&Command, sizeof(AUTODIAL_COMMAND));
/* Copy the address into the command packet */
RtlCopyMemory(&Command.Address, ConnectionAddress, sizeof(AUTODIAL_ADDR));
/* Send it to the driver */
return AcsHlpSendCommand(&Command);
}
/*
* @implemented
*/
BOOLEAN
WINAPI
AcsHlpNoteNewConnection(IN PAUTODIAL_ADDR ConnectionAddress,
IN PAUTODIAL_CONN Connection)
{
AUTODIAL_COMMAND Command;
/* Copy the address into the command packet */
RtlCopyMemory(&Command.Address, ConnectionAddress, sizeof(AUTODIAL_ADDR));
/* Set the New Connection flag and copy the connection data */
Command.NewConnection = TRUE;
RtlCopyMemory(&Command.Connection, Connection, sizeof(AUTODIAL_CONN));
/* Send it to the driver */
return AcsHlpSendCommand(&Command);
}
+30
View File
@@ -0,0 +1,30 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
BOOLEAN
WINAPI
DllMain(HINSTANCE Instance,
DWORD Reason,
LPVOID Reserved)
{
/* Check if we're being attached */
if (Reason == DLL_PROCESS_ATTACH)
{
/* Let's disable TLC calls as an optimization */
DisableThreadLibraryCalls(Instance);
}
/* We're done */
return TRUE;
}
+102
View File
@@ -0,0 +1,102 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/msafd.h
* PURPOSE: Ancillary Function Driver DLL header
*/
#define _WIN32_WINNT 0x502
#define _CRT_SECURE_NO_DEPRECATE
#define WIN32_NO_STATUS
/* PSDK Headers */
#include <winsock2.h>
#include <wsipx.h>
#include <wsnetbs.h>
#include <wininet.h>
/* NDK */
#include <iofuncs.h>
#include <rtltypes.h>
/* Shared GUIDs */
#include <nsp_dns.h>
/* These should go in rasadhlp.h */
#define FILE_DEVICE_ACD 0x000000F1
#define _ACD_CTL_CODE(function, method, access) \
CTL_CODE(FILE_DEVICE_ACD, function, method, access)
#define IOCTL_ACD_RESET \
_ACD_CTL_CODE(0, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ACD_ENABLE \
_ACD_CTL_CODE(1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ACD_NOTIFICATION \
_ACD_CTL_CODE(2, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_ACD_KEEPALIVE \
_ACD_CTL_CODE(3, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_ACD_COMPLETION \
_ACD_CTL_CODE(4, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ACD_CONNECT_ADDRESS \
_ACD_CTL_CODE(5, METHOD_BUFFERED, FILE_READ_ACCESS)
typedef enum
{
AutoDialIp,
AutoDialIpx,
AutoDialNetBios,
AutoDialIpHost
} AUTODIAL_FAMILY;
typedef enum
{
ConnectionIpxLana,
ConnectionIp,
ConnectionIpHost,
ConnectionNetBiosMac,
} CONNECTION_FAMILY;
typedef struct _AUTODIAL_ADDR
{
AUTODIAL_FAMILY Family;
union
{
IN_ADDR Ip4Address;
CHAR IpxNode[6];
CHAR NetBiosAddress[NETBIOS_NAME_LENGTH];
CHAR HostName[INTERNET_MAX_PATH_LENGTH];
};
} AUTODIAL_ADDR, *PAUTODIAL_ADDR;
typedef struct _AUTODIAL_CONN
{
CONNECTION_FAMILY Family;
union
{
UCHAR IpxLana;
ULONG Ip4Address;
WCHAR ConnectionName[32];
CHAR NetBiosMac[6];
};
} AUTODIAL_CONN, *PAUTODIAL_CONN;
typedef struct _AUTODIAL_COMMAND
{
AUTODIAL_ADDR Address;
BOOL NewConnection;
AUTODIAL_CONN Connection;
} AUTODIAL_COMMAND, *PAUTODIAL_COMMAND;
BOOLEAN
WINAPI
AcsHlpNoteNewConnection(
IN PAUTODIAL_ADDR ConnectionAddress,
IN PAUTODIAL_CONN Connection
);
BOOLEAN
WINAPI
AcsHlpAttemptConnection(
IN PAUTODIAL_ADDR ConnectionAddress
);
@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
<module name="rasadhlp" type="win32dll" installbase="system32" installname="rasadhlp.dll">
<importlibrary definition="rasadhlp.spec" />
<include base="ReactOS">include/reactos/winsock</include>
<include base="rasadhlp">.</include>
<library>kernel32</library>
<library>ntdll</library>
<library>ws2_32</library>
<file>autodial.c</file>
<file>init.c</file>
<file>winsock.c</file>
</module>
+6
View File
@@ -0,0 +1,6 @@
@ stdcall AcsHlpAttemptConnection(ptr)
@ stub AcsHlpNbConnection
@ stdcall AcsHlpNoteNewConnection(ptr ptr)
@ stdcall WSAttemptAutodialAddr(ptr long)
@ stdcall WSAttemptAutodialName(ptr)
@ stdcall WSNoteSuccessfulHostentLookup(ptr long)
+137
View File
@@ -0,0 +1,137 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
BOOL
WINAPI
WSAttemptAutodialAddr(IN CONST SOCKADDR FAR *Name,
IN INT NameLength)
{
PSOCKADDR_IN Ip = (PSOCKADDR_IN)Name;
PSOCKADDR_NB NetBios = (PSOCKADDR_NB)Name;
AUTODIAL_ADDR AutodialAdddress;
/* Check the family type */
switch (Name->sa_family)
{
case AF_INET:
/* Normal IPv4, set the Autodial Address Data */
AutodialAdddress.Family = AutoDialIp;
AutodialAdddress.Ip4Address = Ip->sin_addr;
break;
case AF_NETBIOS:
/* NetBIOS, set the Autodial Address Data*/
AutodialAdddress.Family = AutoDialNetBios;
RtlCopyMemory(&AutodialAdddress.NetBiosAddress,
NetBios->snb_name,
NETBIOS_NAME_LENGTH);
break;
default:
/* Unsupported family type */
return FALSE;
}
/* Call the public routine */
return AcsHlpAttemptConnection(&AutodialAdddress);
}
/*
* @implemented
*/
BOOL
WINAPI
WSAttemptAutodialName(IN CONST LPWSAQUERYSETW Restrictions)
{
AUTODIAL_ADDR AutodialAdddress;
CHAR AnsiIp[17];
LPGUID Guid = Restrictions->lpServiceClassId;
/* Make sure we actually have a name */
if (!Restrictions->lpszServiceInstanceName) return FALSE;
/* Check if this is the Hostname GUID */
if (!memcmp(Guid, &HostnameGuid, sizeof(GUID)))
{
/* It is. Set up the Autodial Address Data */
AutodialAdddress.Family = AutoDialIpHost;
WideCharToMultiByte(CP_ACP,
0,
Restrictions->lpszServiceInstanceName,
-1,
AutodialAdddress.HostName,
INTERNET_MAX_PATH_LENGTH - 1,
0,
0);
/* Call the public routine */
return AcsHlpAttemptConnection(&AutodialAdddress);
}
else if (!memcmp(Guid, &AddressGuid, sizeof(GUID)))
{
/* It's actually the IP String GUID */
AutodialAdddress.Family = AutoDialIp;
/* Convert the IP String to ANSI and then convert it to IP */
WideCharToMultiByte(CP_ACP,
0,
Restrictions->lpszServiceInstanceName,
-1,
AnsiIp,
sizeof(AnsiIp) - 1,
0,
0);
_strlwr(AnsiIp);
AutodialAdddress.Ip4Address.S_un.S_addr = inet_addr(AnsiIp);
/* Make sure the IP is valid */
if (AutodialAdddress.Ip4Address.S_un.S_addr == -1) return FALSE;
/* Call the public routine */
return AcsHlpAttemptConnection(&AutodialAdddress);
}
else
{
/* Unknown GUID type */
return FALSE;
}
}
/*
* @implemented
*/
VOID
WINAPI
WSNoteSuccessfulHostentLookup(IN CONST CHAR FAR *Name,
IN CONST ULONG Address)
{
AUTODIAL_ADDR AutodialAdddress;
AUTODIAL_CONN AutodialConnection;
/* Make sure there actually is a name */
if (!(Name) || !strlen(Name)) return;
/* Setup the Address */
AutodialAdddress.Family = AutoDialIpHost;
strcpy(AutodialAdddress.HostName, Name);
/* Setup the new connection */
AutodialConnection.Family = ConnectionIp;
AutodialConnection.Ip4Address = Address;
AcsHlpNoteNewConnection(&AutodialAdddress, &AutodialConnection);
}
+2 -2
View File
@@ -1450,8 +1450,8 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
if (pds)
{
DWORD dwEffect;
DoDragDrop(pda, pds, dwEffect, &dwEffect);
DWORD dwEffect2;
DoDragDrop(pda, pds, dwEffect, &dwEffect2);
}
IDataObject_Release(pda);
}
+223 -63
View File
@@ -43,6 +43,12 @@ typedef struct
LPBYTE pbBuffer;
DWORD dwLength;
DWORD dwPos;
DWORD dwMode;
union {
LPSTR keyNameA;
LPWSTR keyNameW;
}u;
BOOL bUnicode;
} ISHRegStream;
/**************************************************************************
@@ -98,11 +104,34 @@ static ULONG WINAPI IStream_fnRelease(IStream *iface)
{
TRACE(" destroying SHReg IStream (%p)\n",This);
HeapFree(GetProcessHeap(),0,This->pbBuffer);
if (This->hKey)
RegCloseKey(This->hKey);
{
/* write back data in REG_BINARY */
if (This->dwMode == STGM_READWRITE || This->dwMode == STGM_WRITE)
{
if (This->dwLength)
{
if (This->bUnicode)
RegSetValueExW(This->hKey, This->u.keyNameW, 0, REG_BINARY,
(const BYTE *) This->pbBuffer, This->dwLength);
else
RegSetValueExA(This->hKey, This->u.keyNameA, 0, REG_BINARY,
(const BYTE *) This->pbBuffer, This->dwLength);
}
else
{
if (This->bUnicode)
RegDeleteValueW(This->hKey, This->u.keyNameW);
else
RegDeleteValueA(This->hKey, This->u.keyNameA);
}
}
RegCloseKey(This->hKey);
}
HeapFree(GetProcessHeap(),0,This->u.keyNameA);
HeapFree(GetProcessHeap(),0,This->pbBuffer);
HeapFree(GetProcessHeap(),0,This);
return 0;
}
@@ -116,24 +145,21 @@ static ULONG WINAPI IStream_fnRelease(IStream *iface)
static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead)
{
ISHRegStream *This = (ISHRegStream *)iface;
DWORD dwBytesToRead, dwBytesLeft;
DWORD dwBytesToRead;
TRACE("(%p)->(%p,0x%08x,%p)\n",This, pv, cb, pcbRead);
if (!pv)
return STG_E_INVALIDPOINTER;
if (This->dwPos >= This->dwLength)
dwBytesToRead = 0;
else
dwBytesToRead = This->dwLength - This->dwPos;
dwBytesLeft = This->dwLength - This->dwPos;
if ( 0 >= dwBytesLeft ) /* end of buffer */
return S_FALSE;
dwBytesToRead = ( cb > dwBytesLeft) ? dwBytesLeft : cb;
memmove ( pv, (This->pbBuffer) + (This->dwPos), dwBytesToRead);
This->dwPos += dwBytesToRead; /* adjust pointer */
dwBytesToRead = (cb > dwBytesToRead) ? dwBytesToRead : cb;
if (dwBytesToRead != 0) /* not at end of buffer and we want to read something */
{
memmove(pv, This->pbBuffer + This->dwPos, dwBytesToRead);
This->dwPos += dwBytesToRead; /* adjust pointer */
}
if (pcbRead)
*pcbRead = dwBytesToRead;
@@ -147,13 +173,29 @@ static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG
static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
{
ISHRegStream *This = (ISHRegStream *)iface;
DWORD newLen = This->dwPos + cb;
TRACE("(%p)\n",This);
TRACE("(%p, %p, %d, %p)\n",This, pv, cb, pcbWritten);
if (newLen < This->dwPos) /* overflow */
return STG_E_INSUFFICIENTMEMORY;
if (newLen > This->dwLength)
{
LPBYTE newBuf = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pbBuffer, newLen);
if (!newBuf)
return STG_E_INSUFFICIENTMEMORY;
This->dwLength = newLen;
This->pbBuffer = newBuf;
}
memmove(This->pbBuffer + This->dwPos, pv, cb);
This->dwPos += cb; /* adjust pointer */
if (pcbWritten)
*pcbWritten = 0;
*pcbWritten = cb;
return E_NOTIMPL;
return S_OK;
}
/**************************************************************************
@@ -162,12 +204,28 @@ static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb
static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
{
ISHRegStream *This = (ISHRegStream *)iface;
LARGE_INTEGER tmp;
TRACE("(%p, %s, %d %p)\n", This,
wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
TRACE("(%p)\n",This);
if (dwOrigin == STREAM_SEEK_SET)
tmp = dlibMove;
else if (dwOrigin == STREAM_SEEK_CUR)
tmp.QuadPart = This->dwPos + dlibMove.QuadPart;
else if (dwOrigin == STREAM_SEEK_END)
tmp.QuadPart = This->dwLength + dlibMove.QuadPart;
else
return STG_E_INVALIDPARAMETER;
if (tmp.QuadPart < 0)
return STG_E_INVALIDFUNCTION;
/* we cut off the high part here */
This->dwPos = tmp.LowPart;
if (plibNewPosition)
plibNewPosition->QuadPart = 0;
return E_NOTIMPL;
plibNewPosition->QuadPart = This->dwPos;
return S_OK;
}
/**************************************************************************
@@ -176,9 +234,21 @@ static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, D
static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
{
ISHRegStream *This = (ISHRegStream *)iface;
DWORD newLen;
LPBYTE newBuf;
TRACE("(%p)\n",This);
return E_NOTIMPL;
TRACE("(%p, %s)\n", This, wine_dbgstr_longlong(libNewSize.QuadPart));
/* we cut off the high part here */
newLen = libNewSize.LowPart;
newBuf = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pbBuffer, newLen);
if (!newBuf)
return STG_E_INSUFFICIENTMEMORY;
This->pbBuffer = newBuf;
This->dwLength = newLen;
return S_OK;
}
/**************************************************************************
@@ -193,6 +263,8 @@ static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_I
pcbRead->QuadPart = 0;
if (pcbWritten)
pcbWritten->QuadPart = 0;
/* TODO implement */
return E_NOTIMPL;
}
@@ -205,6 +277,7 @@ static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags)
TRACE("(%p)\n",This);
/* commit not supported by this stream */
return E_NOTIMPL;
}
@@ -217,6 +290,7 @@ static HRESULT WINAPI IStream_fnRevert (IStream * iface)
TRACE("(%p)\n",This);
/* revert not supported by this stream */
return E_NOTIMPL;
}
@@ -229,19 +303,35 @@ static HRESULT WINAPI IStream_fnLockUnlockRegion (IStream * iface, ULARGE_INTEGE
TRACE("(%p)\n",This);
/* lock/unlock not supported by this stream */
return E_NOTIMPL;
}
/*************************************************************************
* IStream_fnStat
*/
static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG* pstatstg, DWORD grfStatFlag)
static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG* pstatstg, DWORD grfStatFlag)
{
ISHRegStream *This = (ISHRegStream *)iface;
TRACE("(%p)\n",This);
TRACE("(%p, %p, %d)\n",This,pstatstg,grfStatFlag);
return E_NOTIMPL;
pstatstg->pwcsName = NULL;
pstatstg->type = STGTY_STREAM;
pstatstg->cbSize.QuadPart = This->dwLength;
pstatstg->mtime.dwHighDateTime = 0;
pstatstg->mtime.dwLowDateTime = 0;
pstatstg->ctime.dwHighDateTime = 0;
pstatstg->ctime.dwLowDateTime = 0;
pstatstg->atime.dwHighDateTime = 0;
pstatstg->atime.dwLowDateTime = 0;
pstatstg->grfMode = This->dwMode;
pstatstg->grfLocksSupported = 0;
pstatstg->clsid = CLSID_NULL;
pstatstg->grfStateBits = 0;
pstatstg->reserved = 0;
return S_OK;
}
/*************************************************************************
@@ -252,8 +342,9 @@ static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm)
ISHRegStream *This = (ISHRegStream *)iface;
TRACE("(%p)\n",This);
if (ppstm)
*ppstm = NULL;
*ppstm = NULL;
/* clone not supported by this stream */
return E_NOTIMPL;
}
@@ -333,7 +424,10 @@ static ISHRegStream rsDummyRegStream =
NULL,
NULL,
0,
0
0,
STGM_READWRITE,
{NULL},
FALSE
};
/**************************************************************************
@@ -341,7 +435,7 @@ static ISHRegStream rsDummyRegStream =
*
* Internal helper: Create and initialise a new registry stream object.
*/
static IStream *IStream_Create(HKEY hKey, LPBYTE pbBuffer, DWORD dwLength)
static ISHRegStream *IStream_Create(HKEY hKey, LPBYTE pbBuffer, DWORD dwLength)
{
ISHRegStream* regStream;
@@ -355,9 +449,12 @@ static IStream *IStream_Create(HKEY hKey, LPBYTE pbBuffer, DWORD dwLength)
regStream->pbBuffer = pbBuffer;
regStream->dwLength = dwLength;
regStream->dwPos = 0;
regStream->dwMode = STGM_READWRITE;
regStream->u.keyNameA = NULL;
regStream->bUnicode = FALSE;
}
TRACE ("Returning %p\n", regStream);
return (IStream *)regStream;
return regStream;
}
/*************************************************************************
@@ -378,21 +475,52 @@ static IStream *IStream_Create(HKEY hKey, LPBYTE pbBuffer, DWORD dwLength)
IStream * WINAPI SHOpenRegStream2A(HKEY hKey, LPCSTR pszSubkey,
LPCSTR pszValue,DWORD dwMode)
{
ISHRegStream *tmp;
HKEY hStrKey = NULL;
LPBYTE lpBuff = NULL;
DWORD dwLength, dwType;
DWORD dwLength = 0;
LONG ret;
TRACE("(%p,%s,%s,0x%08x)\n", hKey, pszSubkey, pszValue, dwMode);
/* Open the key, read in binary data and create stream */
if (!RegOpenKeyExA (hKey, pszSubkey, 0, KEY_READ, &hStrKey) &&
!RegQueryValueExA (hStrKey, pszValue, 0, 0, 0, &dwLength) &&
(lpBuff = HeapAlloc (GetProcessHeap(), 0, dwLength)) &&
!RegQueryValueExA (hStrKey, pszValue, 0, &dwType, lpBuff, &dwLength) &&
dwType == REG_BINARY)
return IStream_Create(hStrKey, lpBuff, dwLength);
if (dwMode == STGM_READ)
ret = RegOpenKeyExA(hKey, pszSubkey, 0, KEY_READ, &hStrKey);
else /* in write mode we make sure the subkey exits */
ret = RegCreateKeyExA(hKey, pszSubkey, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hStrKey, NULL);
HeapFree (GetProcessHeap(), 0, lpBuff);
if (ret == ERROR_SUCCESS)
{
if (dwMode == STGM_READ || dwMode == STGM_READWRITE)
{
/* read initial data */
ret = RegQueryValueExA(hStrKey, pszValue, 0, 0, 0, &dwLength);
if (ret == ERROR_SUCCESS && dwLength)
{
lpBuff = HeapAlloc(GetProcessHeap(), 0, dwLength);
RegQueryValueExA(hStrKey, pszValue, 0, 0, lpBuff, &dwLength);
}
}
if (!dwLength)
lpBuff = HeapAlloc(GetProcessHeap(), 0, dwLength);
tmp = IStream_Create(hStrKey, lpBuff, dwLength);
if(tmp)
{
if(pszValue)
{
int len = lstrlenA(pszValue) + 1;
tmp->u.keyNameA = HeapAlloc(GetProcessHeap(), 0, len);
memcpy(tmp->u.keyNameA, pszValue, len);
}
tmp->dwMode = dwMode;
tmp->bUnicode = FALSE;
return (IStream *)tmp;
}
}
HeapFree(GetProcessHeap(), 0, lpBuff);
if (hStrKey)
RegCloseKey(hStrKey);
return NULL;
@@ -406,22 +534,53 @@ IStream * WINAPI SHOpenRegStream2A(HKEY hKey, LPCSTR pszSubkey,
IStream * WINAPI SHOpenRegStream2W(HKEY hKey, LPCWSTR pszSubkey,
LPCWSTR pszValue, DWORD dwMode)
{
ISHRegStream *tmp;
HKEY hStrKey = NULL;
LPBYTE lpBuff = NULL;
DWORD dwLength, dwType;
DWORD dwLength = 0;
LONG ret;
TRACE("(%p,%s,%s,0x%08x)\n", hKey, debugstr_w(pszSubkey),
debugstr_w(pszValue), dwMode);
/* Open the key, read in binary data and create stream */
if (!RegOpenKeyExW (hKey, pszSubkey, 0, KEY_READ, &hStrKey) &&
!RegQueryValueExW (hStrKey, pszValue, 0, 0, 0, &dwLength) &&
(lpBuff = HeapAlloc (GetProcessHeap(), 0, dwLength)) &&
!RegQueryValueExW (hStrKey, pszValue, 0, &dwType, lpBuff, &dwLength) &&
dwType == REG_BINARY)
return IStream_Create(hStrKey, lpBuff, dwLength);
if (dwMode == STGM_READ)
ret = RegOpenKeyExW(hKey, pszSubkey, 0, KEY_READ, &hStrKey);
else /* in write mode we make sure the subkey exits */
ret = RegCreateKeyExW(hKey, pszSubkey, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hStrKey, NULL);
HeapFree (GetProcessHeap(), 0, lpBuff);
if (ret == ERROR_SUCCESS)
{
if (dwMode == STGM_READ || dwMode == STGM_READWRITE)
{
/* read initial data */
ret = RegQueryValueExW(hStrKey, pszValue, 0, 0, 0, &dwLength);
if (ret == ERROR_SUCCESS && dwLength)
{
lpBuff = HeapAlloc(GetProcessHeap(), 0, dwLength);
RegQueryValueExW(hStrKey, pszValue, 0, 0, lpBuff, &dwLength);
}
}
if (!dwLength)
lpBuff = HeapAlloc(GetProcessHeap(), 0, dwLength);
tmp = IStream_Create(hStrKey, lpBuff, dwLength);
if(tmp)
{
if(pszValue)
{
int len = lstrlenW(pszValue) + 1;
tmp->u.keyNameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
memcpy(tmp->u.keyNameW, pszValue, len * sizeof(WCHAR));
}
tmp->dwMode = dwMode;
tmp->bUnicode = TRUE;
return (IStream *)tmp;
}
}
HeapFree(GetProcessHeap(), 0, lpBuff);
if (hStrKey)
RegCloseKey(hStrKey);
return NULL;
@@ -487,24 +646,25 @@ IStream * WINAPI SHOpenRegStreamW(HKEY hkey, LPCWSTR pszSubkey,
* A copy of the memory pointed to by lpbData is made, and is freed
* when the stream is released.
*/
IStream * WINAPI SHCreateMemStream(LPBYTE lpbData, DWORD dwDataLen)
IStream * WINAPI SHCreateMemStream(const BYTE *lpbData, UINT dwDataLen)
{
IStream *iStrmRet = NULL;
LPBYTE lpbDup;
TRACE("(%p,%d)\n", lpbData, dwDataLen);
if (lpbData)
if (!lpbData)
dwDataLen = 0;
lpbDup = HeapAlloc(GetProcessHeap(), 0, dwDataLen);
if (lpbDup)
{
LPBYTE lpbDup = HeapAlloc(GetProcessHeap(), 0, dwDataLen);
memcpy(lpbDup, lpbData, dwDataLen);
iStrmRet = (IStream *)IStream_Create(NULL, lpbDup, dwDataLen);
if (lpbDup)
{
memcpy(lpbDup, lpbData, dwDataLen);
iStrmRet = IStream_Create(NULL, lpbDup, dwDataLen);
if (!iStrmRet)
HeapFree(GetProcessHeap(), 0, lpbDup);
}
if (!iStrmRet)
HeapFree(GetProcessHeap(), 0, lpbDup);
}
return iStrmRet;
}
@@ -539,7 +699,7 @@ HRESULT WINAPI SHCreateStreamWrapper(LPBYTE lpbData, DWORD dwDataLen,
if(dwReserved || !lppStream)
return E_INVALIDARG;
lpStream = IStream_Create(NULL, lpbData, dwDataLen);
lpStream = (IStream *)IStream_Create(NULL, lpbData, dwDataLen);
if(!lpStream)
return E_OUTOFMEMORY;
+5 -5
View File
@@ -643,7 +643,7 @@
@ stdcall PathQuoteSpacesA (str)
@ stdcall PathQuoteSpacesW (wstr)
@ stdcall PathRelativePathToA(ptr str long str long)
@ stdcall PathRelativePathToW(ptr str long str long)
@ stdcall PathRelativePathToW(ptr wstr long wstr long)
@ stdcall PathRemoveArgsA(str)
@ stdcall PathRemoveArgsW(wstr)
@ stdcall PathRemoveBackslashA (str)
@@ -700,9 +700,9 @@
@ stdcall SHGetValueW ( long wstr wstr ptr ptr ptr )
@ stdcall SHIsLowMemoryMachine(long)
@ stdcall SHOpenRegStream2A(long str str long)
@ stdcall SHOpenRegStream2W(long wstr str long)
@ stdcall SHOpenRegStream2W(long wstr wstr long)
@ stdcall SHOpenRegStreamA(long str str long)
@ stdcall SHOpenRegStreamW(long wstr str long)
@ stdcall SHOpenRegStreamW(long wstr wstr long)
@ stdcall SHQueryInfoKeyA(long ptr ptr ptr ptr)
@ stdcall SHQueryInfoKeyW(long ptr ptr ptr ptr)
@ stdcall SHQueryValueExA(long str ptr ptr ptr ptr)
@@ -738,7 +738,7 @@
@ stdcall SHRegSetUSValueA ( str str long ptr long long)
@ stdcall SHRegSetUSValueW ( wstr wstr long ptr long long)
@ stdcall SHRegWriteUSValueA (long str long ptr long long)
@ stdcall SHRegWriteUSValueW (long str long ptr long long)
@ stdcall SHRegWriteUSValueW (long wstr long ptr long long)
@ stdcall SHRegisterValidateTemplate(wstr long)
@ stdcall SHReleaseThreadRef()
@ stdcall SHSetThreadRef (ptr)
@@ -785,7 +785,7 @@
@ stdcall StrPBrkW(wstr wstr)
@ stdcall StrRChrA (str str long)
@ stdcall StrRChrIA (str str long)
@ stdcall StrRChrIW (str str long)
@ stdcall StrRChrIW (wstr wstr long)
@ stdcall StrRChrW (wstr wstr long)
@ stdcall StrRStrIA (str str str)
@ stdcall StrRStrIW (wstr wstr wstr)
+23 -14
View File
@@ -164,6 +164,7 @@ typedef struct
(LPARAM)(es->hwndSelf)); \
} while(0)
/*********************************************************************
*
* EM_CANUNDO
@@ -1225,7 +1226,7 @@ static void EDIT_UnlockBuffer(EDITSTATE *es, BOOL force)
{
WARN("edit hwnd %p already destroyed\n", es->hwndSelf);
return;
}
}
if (!es->lock_count) {
ERR("lock_count == 0 ... please report\n");
@@ -3676,8 +3677,8 @@ static LRESULT EDIT_WM_KeyDown(EDITSTATE *es, INT key)
}
break;
case VK_ESCAPE:
if (!(es->style & ES_MULTILINE) && EDIT_IsInsideDialog(es))
PostMessageW(es->hwndParent, WM_CLOSE, 0, 0);
if ((es->style & ES_MULTILINE) && EDIT_IsInsideDialog(es))
PostMessageW(es->hwndParent, WM_CLOSE, 0, 0);
break;
case VK_TAB:
if ((es->style & ES_MULTILINE) && EDIT_IsInsideDialog(es))
@@ -4601,8 +4602,8 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode)
* WM_XXX messages before WM_NCCREATE is completed.
*/
es->is_unicode = unicode;
es->style = lpcs->style;
es->is_unicode = unicode;
es->style = lpcs->style;
es->bEnableState = !(es->style & WS_DISABLED);
@@ -4670,7 +4671,7 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode)
* If WS_BORDER without WS_EX_CLIENTEDGE is specified we shouldn't have
* a nonclient area and we should handle painting the border ourselves.
*
* When making modifications please ensure that the code still works
* When making modifications please ensure that the code still works
* for edit controls created directly with style 0x50800000, exStyle 0
* (which should have a single pixel border)
*/
@@ -4691,7 +4692,7 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode)
static LRESULT EDIT_WM_Create(EDITSTATE *es, LPCWSTR name)
{
RECT clientRect;
TRACE("%s\n", debugstr_w(name));
/*
* To initialize some final structure members, we call some helper
@@ -4701,7 +4702,7 @@ static LRESULT EDIT_WM_Create(EDITSTATE *es, LPCWSTR name)
*/
EDIT_WM_SetFont(es, 0, FALSE);
EDIT_EM_EmptyUndoBuffer(es);
/* We need to calculate the format rect
(applications may send EM_SETMARGINS before the control gets visible) */
GetClientRect(es->hwndSelf, &clientRect);
@@ -4803,7 +4804,7 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
LRESULT result = 0;
TRACE("hwnd=%p msg=%x (%s) wparam=%lx lparam=%lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam);
if (!es && msg != WM_NCCREATE)
return DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
@@ -5121,6 +5122,9 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
case EM_SETREADONLY16:
#endif
case EM_SETREADONLY:
{
DWORD old_style = es->style;
if (wParam) {
SetWindowLongPtrW( hwnd, GWL_STYLE,
GetWindowLongPtrW( hwnd, GWL_STYLE ) | ES_READONLY );
@@ -5130,8 +5134,13 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
GetWindowLongPtrW( hwnd, GWL_STYLE ) & ~ES_READONLY );
es->style &= ~ES_READONLY;
}
result = 1;
break;
if (old_style ^ es->style)
InvalidateRect(es->hwndSelf, NULL, TRUE);
result = 1;
break;
}
#ifndef __REACTOS__
case EM_SETWORDBREAKPROC16:
@@ -5208,7 +5217,7 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
case WM_GETDLGCODE:
result = DLGC_HASSETSEL | DLGC_WANTCHARS | DLGC_WANTARROWS;
if (es->style & ES_MULTILINE)
result |= DLGC_WANTALLKEYS;
@@ -5483,12 +5492,12 @@ LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
case WM_IME_CONTROL:
break;
default:
result = DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
break;
}
if (es) EDIT_UnlockBuffer(es, FALSE);
TRACE("hwnd=%p msg=%x (%s) -- 0x%08lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), result);
+29 -27
View File
@@ -181,10 +181,11 @@ void DIALOG_EnableOwner( HWND hOwner )
if (hOwner)
hOwner = GetAncestor( hOwner, GA_ROOT );
if (!hOwner) return;
EnableWindow( hOwner, TRUE );
EnableWindow( hOwner, TRUE );
}
/***********************************************************************
/***********************************************************************
* DIALOG_DisableOwner
*
* Helper function for modal dialogs to disable the
@@ -205,7 +206,7 @@ BOOL DIALOG_DisableOwner( HWND hOwner )
return FALSE;
}
/***********************************************************************
/***********************************************************************
* DIALOG_GetControl32
*
* Return the class and text of the control pointed to by ptr,
@@ -303,10 +304,11 @@ static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info,
p++;
/* Next control is on dword boundary */
return (const WORD *)((((int)p) + 3) & ~3);
return (const WORD *)(((UINT_PTR)p + 3) & ~3);
}
/***********************************************************************
/***********************************************************************
* DIALOG_CreateControls32
*
* Create the control windows for a dialog.
@@ -645,9 +647,9 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
/* Get the font name */
result->pointSize = 0;
result->faceName = NULL;
result->weight = FW_DONTCARE;
result->italic = FALSE;
result->faceName = NULL;
if (result->style & DS_SETFONT)
{
@@ -660,18 +662,18 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
*/
if (result->pointSize == 0x7fff)
{
/* We could call SystemParametersInfo here, but then we'd have
* to convert from pixel size to point size (which can be
* imprecise).
*/
/* We could call SystemParametersInfo here, but then we'd have
* to convert from pixel size to point size (which can be
* imprecise).
*/
TRACE(" FONT: Using message box font\n");
}
else
{
if (result->dialogEx)
{
result->weight = GET_WORD(p); p++;
result->italic = LOBYTE(GET_WORD(p)); p++;
result->weight = GET_WORD(p); p++;
result->italic = LOBYTE(GET_WORD(p)); p++;
}
result->faceName = (LPCWSTR)p;
p += wcslen( result->faceName ) + 1;
@@ -726,7 +728,7 @@ static void DEFDLG_RestoreFocus( HWND hwnd )
/* If no saved focus control exists, set focus to the first visible,
non-disabled, WS_TABSTOP control in the dialog */
infoPtr->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE );
if (!IsWindow( infoPtr->hwndFocus )) return;
if (!IsWindow( infoPtr->hwndFocus )) return;
}
DEFDLG_SetFocus( hwnd, infoPtr->hwndFocus );
@@ -783,20 +785,19 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICSW), &ncMetrics, 0))
{
hUserFont = CreateFontIndirectW( &ncMetrics.lfMessageFont );
}
{
hUserFont = CreateFontIndirectW( &ncMetrics.lfMessageFont );
}
}
else
else
{
/* We convert the size to pixels and then make it -ve. This works
* for both +ve and -ve template.pointSize */
int pixels;
pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE,
template.faceName );
/* We convert the size to pixels and then make it -ve. This works
* for both +ve and -ve template.pointSize */
int pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE,
template.faceName );
}
if (hUserFont)
@@ -840,7 +841,7 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
{
HMONITOR monitor = 0;
MONITORINFO mon_info;
mon_info.cbSize = sizeof(mon_info);
if (template.style & DS_CENTER)
{
@@ -947,7 +948,7 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
dlgInfo->hMenu = hMenu;
dlgInfo->xBaseUnit = xBaseUnit;
dlgInfo->yBaseUnit = yBaseUnit;
dlgInfo->idResult = 0;
dlgInfo->idResult = IDOK;
dlgInfo->flags = flags;
/* dlgInfo->hDialogHeap = 0; */
@@ -994,6 +995,7 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
return 0;
}
/***********************************************************************
* DEFDLG_FindDefButton
*
+3
View File
@@ -412,6 +412,9 @@
<directory name="query">
<xi:include href="query/query.rbuild" />
</directory>
<directory name="rasadhlp">
<xi:include href="rasadhlp/rasadhlp.rbuild" />
</directory>
<directory name="rasapi32">
<xi:include href="rasapi32/rasapi32.rbuild" />
</directory>
+29
View File
@@ -802,6 +802,35 @@ EnumPrinterDriversW(LPWSTR Name, LPWSTR Environment, DWORD Level, PBYTE Buffer,
return FALSE;
}
/*
* @unimplemented
*/
DWORD
WINAPI
EnumPrinterKeyA(HANDLE Printer, LPSTR KeyName, LPTSTR Subkey, DWORD SubkeySize, PDWORD SubkeyReturned)
{
OutputDebugStringW(L"winspool EnumPrinterKeyA stub called\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
*SubkeyReturned = 0;
return ERROR_FILE_NOT_FOUND;
}
/*
* @unimplemented
*/
DWORD
WINAPI
EnumPrinterKeyW(HANDLE Printer, LPWSTR KeyName, LPTSTR Subkey, DWORD SubkeySize, PDWORD SubkeyReturned)
{
OutputDebugStringW(L"winspool EnumPrinterKeyW stub called\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
*SubkeyReturned = 0;
return ERROR_FILE_NOT_FOUND;
}
/*
* @unimplemented
+2
View File
@@ -124,6 +124,8 @@
@ stdcall EnumPrinterDriversW(wstr wstr long ptr long ptr ptr)
@ stdcall EnumPrintersA(long ptr long ptr long ptr ptr)
@ stdcall EnumPrintersW(long ptr long ptr long ptr ptr)
@ stdcall EnumPrinterKeyA(long str str long ptr)
@ stdcall EnumPrinterKeyW(long wstr wstr long ptr)
@ stdcall ExtDeviceMode(long long ptr str str ptr str long)
@ stdcall EnumPrintProcessorDatatypesA(str str long ptr long ptr ptr)
@ stdcall EnumPrintProcessorDatatypesW(wstr wstr long ptr long ptr ptr)
+2 -2
View File
@@ -103,7 +103,7 @@ WSAAPI
getxyDataEnt(IN OUT PCHAR *Results,
IN DWORD Length,
IN LPSTR Name,
IN LPGUID Type,
IN LPCGUID Type,
IN LPSTR *NewName)
{
PWSAQUERYSETA WsaQuery = (PWSAQUERYSETA)*Results;
@@ -119,7 +119,7 @@ getxyDataEnt(IN OUT PCHAR *Results,
RtlZeroMemory(WsaQuery, sizeof(*WsaQuery));
WsaQuery->dwSize = sizeof(*WsaQuery);
WsaQuery->lpszServiceInstanceName = Name;
WsaQuery->lpServiceClassId = Type;
WsaQuery->lpServiceClassId = (LPGUID)Type;
WsaQuery->dwNameSpace = NS_ALL;
WsaQuery->dwNumberOfProtocols = 2;
WsaQuery->lpafpProtocols = &afp[0];
+323 -22
View File
@@ -11,16 +11,6 @@
#define NDEBUG
#include "fastfat.h"
NTSYSAPI
NTSTATUS
NTAPI
RtlUpcaseUnicodeStringToCountedOemString(
IN OUT POEM_STRING DestinationString,
IN PCUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString
);
/* FUNCTIONS *****************************************************************/
IO_STATUS_BLOCK
@@ -41,6 +31,110 @@ FatiOpenRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
return Iosb;
}
FF_ERROR
NTAPI
FatiTryToOpen(IN PFILE_OBJECT FileObject,
IN PVCB Vcb)
{
OEM_STRING AnsiName;
CHAR AnsiNameBuf[512];
FF_ERROR Error;
NTSTATUS Status;
FF_FILE *FileHandle;
/* Convert the name to ANSI */
AnsiName.Buffer = AnsiNameBuf;
AnsiName.Length = 0;
AnsiName.MaximumLength = sizeof(AnsiNameBuf);
RtlZeroMemory(AnsiNameBuf, sizeof(AnsiNameBuf));
Status = RtlUpcaseUnicodeStringToCountedOemString(&AnsiName, &FileObject->FileName, FALSE);
if (!NT_SUCCESS(Status))
{
ASSERT(FALSE);
}
/* Open the file with FullFAT */
FileHandle = FF_Open(Vcb->Ioman, AnsiName.Buffer, FF_MODE_READ, &Error);
/* Close the handle */
if (FileHandle) FF_Close(FileHandle);
/* Return status */
return Error;
}
IO_STATUS_BLOCK
NTAPI
FatiOpenExistingDir(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
IN PVCB Vcb,
IN PFCB ParentDcb,
IN PACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN ULONG AllocationSize,
IN PFILE_FULL_EA_INFORMATION EaBuffer,
IN ULONG EaLength,
IN UCHAR FileAttributes,
IN ULONG CreateDisposition,
IN BOOLEAN DeleteOnClose)
{
IO_STATUS_BLOCK Iosb = {{0}};
OEM_STRING AnsiName;
CHAR AnsiNameBuf[512];
PFCB Fcb;
NTSTATUS Status;
FF_FILE *FileHandle;
/* Only open is permitted */
if (CreateDisposition != FILE_OPEN &&
CreateDisposition != FILE_OPEN_IF)
{
Iosb.Status = STATUS_OBJECT_NAME_COLLISION;
return Iosb;
}
// TODO: Check dir access
/* Convert the name to ANSI */
AnsiName.Buffer = AnsiNameBuf;
AnsiName.Length = 0;
AnsiName.MaximumLength = sizeof(AnsiNameBuf);
RtlZeroMemory(AnsiNameBuf, sizeof(AnsiNameBuf));
Status = RtlUpcaseUnicodeStringToCountedOemString(&AnsiName, &FileObject->FileName, FALSE);
if (!NT_SUCCESS(Status))
{
ASSERT(FALSE);
}
/* Open the dir with FullFAT */
FileHandle = FF_Open(Vcb->Ioman, AnsiName.Buffer, FF_MODE_DIR, NULL);
if (!FileHandle)
{
Iosb.Status = STATUS_OBJECT_NAME_NOT_FOUND; // FIXME: A shortcut for now
return Iosb;
}
/* Create a new DCB for this directory */
Fcb = FatCreateDcb(IrpContext, Vcb, ParentDcb, FileHandle);
/* Set share access */
IoSetShareAccess(*DesiredAccess, ShareAccess, FileObject, &Fcb->ShareAccess);
/* Set context and section object pointers */
FatSetFileObject(FileObject,
UserDirectoryOpen,
Fcb,
FatCreateCcb());
Iosb.Status = STATUS_SUCCESS;
Iosb.Information = FILE_OPENED;
DPRINT1("Successfully opened dir %s\n", AnsiNameBuf);
return Iosb;
}
IO_STATUS_BLOCK
NTAPI
FatiOpenExistingFile(IN PFAT_IRP_CONTEXT IrpContext,
@@ -227,9 +321,9 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
ULONG CreateDisposition;
/* Control blocks */
PVCB Vcb, DecodedVcb;
PFCB Fcb, NextFcb;
PCCB Ccb;
PVCB Vcb, DecodedVcb, RelatedVcb;
PFCB Fcb, NextFcb, RelatedDcb;
PCCB Ccb, RelatedCcb;
PFCB ParentDcb;
/* IRP data */
@@ -249,8 +343,11 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
IO_STATUS_BLOCK Iosb;
PIO_STACK_LOCATION IrpSp;
BOOLEAN EndBackslash = FALSE, OpenedAsDos;
UNICODE_STRING RemainingPart, FirstName, NextName;
UNICODE_STRING RemainingPart, FirstName, NextName, FileNameUpcased;
OEM_STRING AnsiFirstName;
FF_ERROR FfError;
TYPE_OF_OPEN TypeOfOpen;
BOOLEAN OplockPostIrp = FALSE;
Iosb.Status = STATUS_SUCCESS;
@@ -427,8 +524,42 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
/* Check if this is a relative open */
if (RelatedFO)
{
// RelatedFO will be a parent directory
UNIMPLEMENTED;
/* Decode the file object */
TypeOfOpen = FatDecodeFileObject(RelatedFO,
&RelatedVcb,
&RelatedDcb,
&RelatedCcb);
/* Check open type */
if (TypeOfOpen != UserFileOpen &&
TypeOfOpen != UserDirectoryOpen)
{
DPRINT1("Invalid file object!\n");
/* Cleanup and return */
FatReleaseVcb(IrpContext, Vcb);
return STATUS_OBJECT_PATH_NOT_FOUND;
}
/* File path must be relative */
if (FileName.Length != 0 &&
FileName.Buffer[0] == L'\\')
{
/* The name is absolute, fail */
FatReleaseVcb(IrpContext, Vcb);
return STATUS_OBJECT_NAME_INVALID;
}
/* Make sure volume is the same */
ASSERT(RelatedVcb == Vcb);
/* Save VPB */
FileObject->Vpb = RelatedFO->Vpb;
/* Set parent DCB */
ParentDcb = RelatedDcb;
DPRINT1("Opening file '%wZ' relatively to '%wZ'\n", &FileName, &ParentDcb->FullFileName);
}
else
{
@@ -544,10 +675,22 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
&OpenedAsDos);
}
/* Check if we found anything */
/* If nothing found - try with unicode */
if (!NextFcb && Fcb->Dcb.SplayLinksUnicode)
{
ASSERT(FALSE);
FileNameUpcased.Buffer = FsRtlAllocatePool(PagedPool, FirstName.Length);
FileNameUpcased.Length = 0;
FileNameUpcased.MaximumLength = FirstName.Length;
/* Downcase and then upcase to normalize it */
Status = RtlDowncaseUnicodeString(&FileNameUpcased, &FirstName, FALSE);
Status = RtlUpcaseUnicodeString(&FileNameUpcased, &FileNameUpcased, FALSE);
/* Try to find FCB again using unicode name */
NextFcb = FatFindFcb(IrpContext,
&Fcb->Dcb.SplayLinksUnicode,
(PSTRING)&FileNameUpcased,
&OpenedAsDos);
}
/* Move to the next FCB */
@@ -589,8 +732,116 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
/* We have a valid FCB now */
if (!RemainingPart.Length)
{
DPRINT1("It's possible to open an existing FCB\n");
ASSERT(FALSE);
/* Check for target dir open */
if (OpenTargetDirectory)
{
DPRINT1("Opening target dir is missing\n");
ASSERT(FALSE);
}
/* Check this FCB's type */
if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB ||
FatNodeType(Fcb) == FAT_NTC_DCB)
{
/* Open a directory */
if (NonDirectoryFile)
{
/* Forbidden */
Iosb.Status = STATUS_FILE_IS_A_DIRECTORY;
ASSERT(FALSE);
return Iosb.Status;
}
/* Open existing DCB */
Iosb = FatiOpenExistingDcb(IrpContext,
FileObject,
Vcb,
Fcb,
DesiredAccess,
ShareAccess,
CreateDisposition,
NoEaKnowledge,
DeleteOnClose);
/* Save information */
Irp->IoStatus.Information = Iosb.Information;
/* Unlock VCB */
FatReleaseVcb(IrpContext, Vcb);
/* Complete the request */
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
return Iosb.Status;
}
else if (FatNodeType(Fcb) == FAT_NTC_FCB)
{
/* Open a file */
if (OpenDirectory)
{
/* Forbidden */
Iosb.Status = STATUS_NOT_A_DIRECTORY;
ASSERT(FALSE);
return Iosb.Status;
}
/* Check for trailing backslash */
if (EndBackslash)
{
/* Forbidden */
Iosb.Status = STATUS_OBJECT_NAME_INVALID;
ASSERT(FALSE);
return Iosb.Status;
}
Iosb = FatiOpenExistingFcb(IrpContext,
FileObject,
Vcb,
Fcb,
DesiredAccess,
ShareAccess,
AllocationSize,
EaBuffer,
EaLength,
FileAttributes,
CreateDisposition,
NoEaKnowledge,
DeleteOnClose,
OpenedAsDos,
&OplockPostIrp);
/* Check if it's pending */
if (Iosb.Status != STATUS_PENDING)
{
/* In case of success set cache supported flag */
if (NT_SUCCESS(Iosb.Status) && !NoIntermediateBuffering)
{
SetFlag(FileObject->Flags, FO_CACHE_SUPPORTED);
}
/* Save information */
Irp->IoStatus.Information = Iosb.Information;
/* Unlock VCB */
FatReleaseVcb(IrpContext, Vcb);
/* Complete the request */
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
return Iosb.Status;
}
else
{
/* Queue this IRP */
UNIMPLEMENTED;
ASSERT(FALSE);
}
}
else
{
/* Unexpected FCB type */
KeBugCheckEx(/*FAT_FILE_SYSTEM*/0x23, __LINE__, (ULONG_PTR)Fcb, 0, 0);
}
}
/* During parsing we encountered a part which has no attached FCB/DCB.
@@ -637,13 +888,63 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
/* Create a DCB for this entry */
ParentDcb = FatCreateDcb(IrpContext,
Vcb,
ParentDcb);
ParentDcb,
NULL);
/* Set its name */
FatSetFullNameInFcb(ParentDcb, &FirstName);
}
// TODO: Try to open directory
/* Try to open it and get a result, saying if this is a dir or a file */
FfError = FatiTryToOpen(FileObject, Vcb);
/* Check if we need to open target directory */
if (OpenTargetDirectory)
{
// TODO: Open target directory
UNIMPLEMENTED;
}
/* Check, if path is a directory or a file */
if (FfError == FF_ERR_FILE_OBJECT_IS_A_DIR)
{
if (NonDirectoryFile)
{
DPRINT1("Can't open dir as a file\n");
/* Unlock VCB */
FatReleaseVcb(IrpContext, Vcb);
/* Complete the request */
Iosb.Status = STATUS_FILE_IS_A_DIRECTORY;
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
return Iosb.Status;
}
/* Open this directory */
Iosb = FatiOpenExistingDir(IrpContext,
FileObject,
Vcb,
ParentDcb,
DesiredAccess,
ShareAccess,
AllocationSize,
EaBuffer,
EaLength,
FileAttributes,
CreateDisposition,
DeleteOnClose);
Irp->IoStatus.Information = Iosb.Information;
/* Unlock VCB */
FatReleaseVcb(IrpContext, Vcb);
/* Complete the request */
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
return Iosb.Status;
}
/* If end backslash here, then it's definately not permitted,
since we're opening files here */
+29 -1
View File
@@ -127,7 +127,8 @@ PFCB
NTAPI
FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PFCB ParentDcb)
IN PFCB ParentDcb,
IN FF_FILE *FileHandle)
{
PFCB Fcb;
@@ -162,7 +163,34 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
/* Initialize parent dcb list */
InitializeListHead(&Fcb->Dcb.ParentDcbList);
/* Set FullFAT handle */
Fcb->FatHandle = FileHandle;
/* Set names */
if (FileHandle)
FatSetFcbNames(IrpContext, Fcb);
return Fcb;
}
IO_STATUS_BLOCK
NTAPI
FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
IN PVCB Vcb,
IN PFCB Dcb,
IN PACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN ULONG CreateDisposition,
IN BOOLEAN NoEaKnowledge,
IN BOOLEAN DeleteOnClose)
{
IO_STATUS_BLOCK Iosb = {{0}};
Iosb.Status = STATUS_NOT_IMPLEMENTED;
UNIMPLEMENTED;
return Iosb;
}
/* EOF */
@@ -385,6 +385,23 @@ FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext,
}
}
BOOLEAN
NTAPI
FatAcquireSharedVcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb)
{
/* Acquire VCB's resource if possible */
if (ExAcquireResourceSharedLite(&Vcb->Resource,
BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
return TRUE;
}
else
{
return FALSE;
}
}
VOID
NTAPI
FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext,
@@ -35,6 +35,15 @@
ExReleaseResourceLite(&(FatGlobalData.Resource)); \
}
NTSYSAPI
NTSTATUS
NTAPI
RtlUpcaseUnicodeStringToCountedOemString(
IN OUT POEM_STRING DestinationString,
IN PCUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString
);
/* ------------------------------------------------------ shutdown.c */
@@ -50,6 +59,13 @@ FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS NTAPI
FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp);
VOID NTAPI
FatReadStreamFile(PVCB Vcb,
ULONGLONG ByteOffset,
ULONG ByteSize,
PBCB *Bcb,
PVOID *Buffer);
/* ------------------------------------------------------ blockdev.c */
NTSTATUS
NTAPI
@@ -77,7 +93,19 @@ FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
PFCB NTAPI
FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PFCB ParentDcb);
IN PFCB ParentDcb,
IN FF_FILE *FileHandle);
IO_STATUS_BLOCK NTAPI
FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
IN PVCB Vcb,
IN PFCB Dcb,
IN PACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN ULONG CreateDisposition,
IN BOOLEAN NoEaKnowledge,
IN BOOLEAN DeleteOnClose);
/* -------------------------------------------------------- create.c */
@@ -143,6 +171,10 @@ BOOLEAN NTAPI
FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb);
BOOLEAN NTAPI
FatAcquireSharedVcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb);
VOID NTAPI
FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PVCB Vcb);
@@ -188,6 +220,14 @@ FatReadBlocks(FF_T_UINT8 *pBuffer, FF_T_UINT32 SectorAddress, FF_T_UINT32 Count,
NTSTATUS NTAPI
FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
VOID NTAPI
FatOplockComplete(IN PVOID Context,
IN PIRP Irp);
VOID NTAPI
FatPrePostIrp(IN PVOID Context,
IN PIRP Irp);
/* --------------------------------------------------------- fsctl.c */
NTSTATUS NTAPI
@@ -198,6 +238,10 @@ FatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS NTAPI FatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS NTAPI FatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* --------------------------------------------------------- fullfat.c */
FF_FILE *FF_OpenW(FF_IOMAN *pIoman, PUNICODE_STRING pathW, FF_T_UINT8 Mode, FF_ERROR *pError);
/* --------------------------------------------------------- iface.c */
NTSTATUS
@@ -284,6 +328,23 @@ FatCreateFcb(
IN PFCB ParentDcb,
IN FF_FILE *FileHandle);
IO_STATUS_BLOCK NTAPI
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
IN PVCB Vcb,
IN PFCB Fcb,
IN PACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN ULONG AllocationSize,
IN PFILE_FULL_EA_INFORMATION EaBuffer,
IN ULONG EaLength,
IN UCHAR FileAttributes,
IN ULONG CreateDisposition,
IN BOOLEAN NoEaKnowledge,
IN BOOLEAN DeleteOnClose,
IN BOOLEAN OpenedAsDos,
OUT PBOOLEAN OplockPostIrp);
PFCB NTAPI
FatFindFcb(PFAT_IRP_CONTEXT IrpContext,
PRTL_SPLAY_LINKS *RootNode,
@@ -133,9 +133,10 @@ typedef struct _FAT_METHODS {
PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun;
} FAT_METHODS, *PFAT_METHODS;
#define VCB_STATE_FLAG_LOCKED 0x01
#define VCB_STATE_FLAG_DIRTY 0x02
#define VCB_STATE_MOUNTED_DIRTY 0x04
#define VCB_STATE_FLAG_LOCKED 0x01
#define VCB_STATE_FLAG_DIRTY 0x02
#define VCB_STATE_MOUNTED_DIRTY 0x04
#define VCB_STATE_CREATE_IN_PROGRESS 0x08
typedef enum _VCB_CONDITION
{
@@ -249,6 +250,8 @@ typedef enum _FCB_CONDITION
#define FCB_STATE_HAS_NAMES 0x01
#define FCB_STATE_HAS_UNICODE_NAME 0x02
#define FCB_STATE_PAGEFILE 0x04
#define FCB_STATE_DELAY_CLOSE 0x08
typedef struct _FCB
{
@@ -264,7 +267,6 @@ typedef struct _FCB
ERESOURCE Resource; // nonpaged!
ERESOURCE PagingIoResource; // nonpaged!
FILE_LOCK Lock;
/* First cluster in the fat allocation chain */
ULONG FirstClusterOfFile;
/* A list of all FCBs of that DCB */
@@ -277,6 +279,8 @@ typedef struct _FCB
ULONG State;
/* Fcb condition */
FCB_CONDITION Condition;
/* Share access */
SHARE_ACCESS ShareAccess;
/* Mcb mapping Vbo->Lbo */
LARGE_MCB Mcb;
ULONG FirstCluster;
@@ -303,6 +307,13 @@ typedef struct _FCB
PKEVENT OutstandingAsyncEvent;
union
{
struct
{
/* File and Op locks */
FILE_LOCK Lock;
OPLOCK Oplock;
} Fcb;
struct
{
/* A list of all FCBs/DCBs opened under this DCB */
+271 -6
View File
@@ -172,6 +172,266 @@ FatCreateCcb()
return Ccb;
}
IO_STATUS_BLOCK
NTAPI
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
IN PVCB Vcb,
IN PFCB Fcb,
IN PACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN ULONG AllocationSize,
IN PFILE_FULL_EA_INFORMATION EaBuffer,
IN ULONG EaLength,
IN UCHAR FileAttributes,
IN ULONG CreateDisposition,
IN BOOLEAN NoEaKnowledge,
IN BOOLEAN DeleteOnClose,
IN BOOLEAN OpenedAsDos,
OUT PBOOLEAN OplockPostIrp)
{
IO_STATUS_BLOCK Iosb = {{0}};
ACCESS_MASK AddedAccess = 0;
BOOLEAN Hidden;
BOOLEAN System;
PCCB Ccb = NULL;
NTSTATUS Status;
/* Acquire exclusive FCB lock */
(VOID)FatAcquireExclusiveFcb(IrpContext, Fcb);
*OplockPostIrp = FALSE;
/* Check if there is a batch oplock */
if (FsRtlCurrentBatchOplock(&Fcb->Fcb.Oplock))
{
/* Return with a special information field */
Iosb.Information = FILE_OPBATCH_BREAK_UNDERWAY;
/* Check the oplock */
Iosb.Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock,
IrpContext->Irp,
IrpContext,
FatOplockComplete,
FatPrePostIrp);
if (Iosb.Status != STATUS_SUCCESS &&
Iosb.Status != STATUS_OPLOCK_BREAK_IN_PROGRESS)
{
/* The Irp needs to be queued */
*OplockPostIrp = TRUE;
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
}
/* Validate parameters and modify access */
if (CreateDisposition == FILE_CREATE)
{
Iosb.Status = STATUS_OBJECT_NAME_COLLISION;
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
else if (CreateDisposition == FILE_SUPERSEDE)
{
SetFlag(AddedAccess, DELETE & ~(*DesiredAccess));
*DesiredAccess |= DELETE;
}
else if ((CreateDisposition == FILE_OVERWRITE) ||
(CreateDisposition == FILE_OVERWRITE_IF))
{
SetFlag(AddedAccess,
(FILE_WRITE_DATA | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES)
& ~(*DesiredAccess) );
*DesiredAccess |= FILE_WRITE_DATA | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES;
}
// TODO: Check desired access
// TODO: Check if this file is readonly and DeleteOnClose is set
/* Validate disposition information */
if ((CreateDisposition == FILE_SUPERSEDE) ||
(CreateDisposition == FILE_OVERWRITE) ||
(CreateDisposition == FILE_OVERWRITE_IF))
{
// TODO: Get this attributes from the dirent
Hidden = FALSE;
System = FALSE;
if ((Hidden && !FlagOn(FileAttributes, FILE_ATTRIBUTE_HIDDEN)) ||
(System && !FlagOn(FileAttributes, FILE_ATTRIBUTE_SYSTEM)))
{
DPRINT1("Hidden/system attributes don't match\n");
Iosb.Status = STATUS_ACCESS_DENIED;
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
// TODO: Check for write protected volume
}
/* Check share access */
Iosb.Status = IoCheckShareAccess(*DesiredAccess,
ShareAccess,
FileObject,
&Fcb->ShareAccess,
FALSE);
if (!NT_SUCCESS(Iosb.Status))
{
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
/* Check the oplock status after checking for share access */
Iosb.Status = FsRtlCheckOplock(&Fcb->Fcb.Oplock,
IrpContext->Irp,
IrpContext,
FatOplockComplete,
FatPrePostIrp );
if (Iosb.Status != STATUS_SUCCESS &&
Iosb.Status != STATUS_OPLOCK_BREAK_IN_PROGRESS)
{
/* The Irp needs to be queued */
*OplockPostIrp = TRUE;
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
/* Set Fast I/O flag */
Fcb->Header.IsFastIoPossible = FALSE; //FatiIsFastIoPossible(Fcb);
/* Make sure image is not mapped */
if (DeleteOnClose || FlagOn(*DesiredAccess, FILE_WRITE_DATA))
{
/* Try to flush the image section */
if (!MmFlushImageSection(&Fcb->SectionObjectPointers, MmFlushForWrite))
{
/* Yes, image section exists, set correct status code */
if (DeleteOnClose)
Iosb.Status = STATUS_CANNOT_DELETE;
else
Iosb.Status = STATUS_SHARING_VIOLATION;
/* Release the FCB and return */
FatReleaseFcb(IrpContext, Fcb);
return Iosb;
}
}
/* Flush the cache if it's non-cached non-pagefile access */
if (FlagOn(FileObject->Flags, FO_NO_INTERMEDIATE_BUFFERING) &&
Fcb->SectionObjectPointers.DataSectionObject &&
!FlagOn(Fcb->State, FCB_STATE_PAGEFILE))
{
/* Set the flag that create is in progress */
SetFlag(Fcb->Vcb->State, VCB_STATE_CREATE_IN_PROGRESS);
/* Flush the cache */
CcFlushCache(&Fcb->SectionObjectPointers, NULL, 0, NULL);
/* Acquire and release Paging I/O resource before purging the cache section
to let lazy writer finish */
ExAcquireResourceExclusiveLite( Fcb->Header.PagingIoResource, TRUE);
ExReleaseResourceLite( Fcb->Header.PagingIoResource );
/* Delete the cache section */
CcPurgeCacheSection(&Fcb->SectionObjectPointers, NULL, 0, FALSE);
/* Clear the flag */
ClearFlag(Fcb->Vcb->State, VCB_STATE_CREATE_IN_PROGRESS);
}
/* Check create disposition flags and branch accordingly */
if (CreateDisposition == FILE_OPEN ||
CreateDisposition == FILE_OPEN_IF)
{
DPRINT("Opening a file\n");
/* Check if we need to bother with EA */
if (NoEaKnowledge && FALSE /* FatIsFat32(Vcb)*/)
{
UNIMPLEMENTED;
}
/* Set up file object */
Ccb = FatCreateCcb(IrpContext);
FatSetFileObject(FileObject,
UserFileOpen,
Fcb,
Ccb);
FileObject->SectionObjectPointer = &Fcb->SectionObjectPointers;
/* The file is opened */
Iosb.Information = FILE_OPENED;
goto SuccComplete;
}
else if ((CreateDisposition == FILE_SUPERSEDE) ||
(CreateDisposition == FILE_OVERWRITE) ||
(CreateDisposition == FILE_OVERWRITE_IF))
{
UNIMPLEMENTED;
ASSERT(FALSE);
}
else
{
/* We can't get here */
KeBugCheckEx(0x23, CreateDisposition, 0, 0, 0);
}
SuccComplete:
/* If all is fine */
if (Iosb.Status != STATUS_PENDING &&
NT_SUCCESS(Iosb.Status))
{
/* Update access if needed */
if (AddedAccess)
{
/* Remove added access flags from desired access */
ClearFlag(*DesiredAccess, AddedAccess);
/* Check share access */
Status = IoCheckShareAccess(*DesiredAccess,
ShareAccess,
FileObject,
&Fcb->ShareAccess,
TRUE);
/* Make sure it's success */
ASSERT(Status == STATUS_SUCCESS);
}
else
{
/* Update the share access */
IoUpdateShareAccess(FileObject, &Fcb->ShareAccess);
}
/* Clear the delay close */
ClearFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
/* Increase global volume counter */
Vcb->OpenFileCount++;
// TODO: Handle DeleteOnClose and OpenedAsDos by storing those flags in CCB
}
return Iosb;
}
VOID
NTAPI
FatGetFcbUnicodeName(IN PFAT_IRP_CONTEXT IrpContext,
@@ -187,11 +447,16 @@ FatGetFcbUnicodeName(IN PFAT_IRP_CONTEXT IrpContext,
OEM_STRING LongNameOem;
NTSTATUS Status;
/* We support only files now, not directories */
if (Fcb->Header.NodeTypeCode != FAT_NTC_FCB)
/* Make sure this FCB has a FullFAT handle associated with it */
if (Fcb->FatHandle == NULL &&
FatNodeType(Fcb) == FAT_NTC_DCB)
{
UNIMPLEMENTED;
ASSERT(FALSE);
/* Open the dir with FullFAT */
Fcb->FatHandle = FF_OpenW(Fcb->Vcb->Ioman, &Fcb->FullFileName, FF_MODE_DIR, NULL);
if (!Fcb->FatHandle)
{
ASSERT(FALSE);
}
}
/* Get the dir entry */
@@ -502,7 +767,7 @@ FatSetFcbNames(IN PFAT_IRP_CONTEXT IrpContext,
RtlDowncaseUnicodeString(UnicodeName, UnicodeName, FALSE);
RtlUpcaseUnicodeString(UnicodeName, UnicodeName, FALSE);
DPRINT1("Converted long name: %wZ\n", UnicodeName);
DPRINT("Converted long name: %wZ\n", UnicodeName);
/* Add the long unicode name link */
FatInsertName(IrpContext, &Fcb->ParentFcb->Dcb.SplayLinksUnicode, &Fcb->LongName);
@@ -603,7 +868,7 @@ Fati8dot3ToString(IN PCHAR FileName,
/* Set the length */
OutString->Length = BaseLen + ExtLen;
DPRINT1("'%s', len %d\n", OutString->Buffer, OutString->Length);
DPRINT("'%s', len %d\n", OutString->Buffer, OutString->Length);
}
VOID
@@ -47,6 +47,37 @@ FatiCleanVcbs(PFAT_IRP_CONTEXT IrpContext)
ExReleaseResourceLite(&FatGlobalData.Resource);
}
VOID
NTAPI
FatiUnpackBpb(PBIOS_PARAMETER_BLOCK Bpb, PPACKED_BIOS_PARAMETER_BLOCK PackedBpb)
{
CopyUchar2(&Bpb->BytesPerSector, &PackedBpb->BytesPerSector[0]);
CopyUchar1(&Bpb->SectorsPerCluster, &PackedBpb->SectorsPerCluster[0]);
CopyUchar2(&Bpb->ReservedSectors, &PackedBpb->ReservedSectors[0]);
CopyUchar1(&Bpb->Fats, &PackedBpb->Fats[0]);
CopyUchar2(&Bpb->RootEntries, &PackedBpb->RootEntries[0]);
CopyUchar2(&Bpb->Sectors, &PackedBpb->Sectors[0]);
CopyUchar1(&Bpb->Media, &PackedBpb->Media[0]);
CopyUchar2(&Bpb->SectorsPerFat, &PackedBpb->SectorsPerFat[0]);
CopyUchar2(&Bpb->SectorsPerTrack, &PackedBpb->SectorsPerTrack[0]);
CopyUchar2(&Bpb->Heads, &PackedBpb->Heads[0]);
CopyUchar4(&Bpb->HiddenSectors, &PackedBpb->HiddenSectors[0]);
CopyUchar4(&Bpb->LargeSectors, &PackedBpb->LargeSectors[0]);
CopyUchar4(&Bpb->LargeSectorsPerFat, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->LargeSectorsPerFat[0]);
CopyUchar2(&Bpb->ExtendedFlags, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->ExtendedFlags[0]);
CopyUchar2(&Bpb->FsVersion, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->FsVersion[0]);
CopyUchar4(&Bpb->RootDirFirstCluster,&((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->RootDirFirstCluster[0]);
CopyUchar2(&Bpb->FsInfoSector, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->FsInfoSector[0]);
CopyUchar2(&Bpb->BackupBootSector, &((PPACKED_BIOS_PARAMETER_BLOCK_EX)PackedBpb)->BackupBootSector[0]);
}
BOOLEAN
NTAPI
FatiBpbFat32(PPACKED_BIOS_PARAMETER_BLOCK PackedBpb)
{
return (*(USHORT *)(&PackedBpb->SectorsPerFat) == 0);
}
NTSTATUS
NTAPI
FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
@@ -60,6 +91,8 @@ FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
PVOLUME_DEVICE_OBJECT VolumeDevice;
VCB *Vcb;
FF_ERROR Error;
PBCB BootBcb;
PPACKED_BOOT_SECTOR BootSector;
DPRINT1("FatMountVolume()\n");
@@ -167,7 +200,46 @@ FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
goto FatMountVolumeCleanup;
}
// TODO: Read BPB and store it in Vcb->Bpb
/* Read the boot sector */
FatReadStreamFile(Vcb, 0, sizeof(PACKED_BOOT_SECTOR), &BootBcb, (PVOID)&BootSector);
/* Check if it's successful */
if (!BootBcb)
{
Status = STATUS_UNRECOGNIZED_VOLUME;
goto FatMountVolumeCleanup;
}
/* Unpack data */
FatiUnpackBpb(&Vcb->Bpb, &BootSector->PackedBpb);
/* Verify if sector size matches */
if (DiskGeometry.BytesPerSector != Vcb->Bpb.BytesPerSector)
{
DPRINT1("Disk geometry BPS %d and bios BPS %d don't match!\n",
DiskGeometry.BytesPerSector, Vcb->Bpb.BytesPerSector);
/* Fail */
Status = STATUS_UNRECOGNIZED_VOLUME;
goto FatMountVolumeCleanup;
}
/* If Sectors value is set, discard the LargeSectors value */
if (Vcb->Bpb.Sectors) Vcb->Bpb.LargeSectors = 0;
/* Copy serial number */
if (FatiBpbFat32(&BootSector->PackedBpb))
{
CopyUchar4(&Vpb->SerialNumber, ((PPACKED_BOOT_SECTOR_EX)BootSector)->Id);
}
else
{
/* This is FAT12/16 */
CopyUchar4(&Vpb->SerialNumber, BootSector->Id);
}
/* Unpin the BCB */
CcUnpinData(BootBcb);
/* Create root DCB for it */
FatCreateRootDcb(IrpContext, &VolumeDevice->Vcb);
@@ -249,7 +321,7 @@ FatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
PFAT_IRP_CONTEXT IrpContext;
BOOLEAN CanWait = TRUE;
DPRINT1("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
DPRINT("FatFileSystemControl(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
/* Get CanWait flag */
if (IoGetCurrentIrpStackLocation(Irp)->FileObject)
@@ -77,4 +77,27 @@ FatReadBlocks(FF_T_UINT8 *DestBuffer, FF_T_UINT32 SectorAddress, FF_T_UINT32 Cou
return Count;
}
FF_FILE *FF_OpenW(FF_IOMAN *pIoman, PUNICODE_STRING pathW, FF_T_UINT8 Mode, FF_ERROR *pError)
{
OEM_STRING AnsiName;
CHAR AnsiNameBuf[512];
NTSTATUS Status;
/* Convert the name to ANSI */
AnsiName.Buffer = AnsiNameBuf;
AnsiName.Length = 0;
AnsiName.MaximumLength = sizeof(AnsiNameBuf);
RtlZeroMemory(AnsiNameBuf, sizeof(AnsiNameBuf));
Status = RtlUpcaseUnicodeStringToCountedOemString(&AnsiName, pathW, FALSE);
if (!NT_SUCCESS(Status))
{
ASSERT(FALSE);
}
DPRINT1("Opening '%s'\n", AnsiName.Buffer);
/* Call FullFAT's handler */
return FF_Open(pIoman, AnsiName.Buffer, Mode, pError);
}
/* EOF */
@@ -21,4 +21,20 @@ FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
return STATUS_NOT_IMPLEMENTED;
}
VOID
NTAPI
FatOplockComplete(IN PVOID Context,
IN PIRP Irp)
{
UNIMPLEMENTED;
}
VOID
NTAPI
FatPrePostIrp(IN PVOID Context,
IN PIRP Irp)
{
UNIMPLEMENTED;
}
/* EOF */
@@ -8,17 +8,159 @@
/* INCLUDES *****************************************************************/
#define NDEBUG
//#define NDEBUG
#include "fastfat.h"
/* FUNCTIONS ****************************************************************/
NTSTATUS
NTAPI
FatiQueryFsVolumeInfo(PVCB Vcb,
PFILE_FS_VOLUME_INFORMATION Buffer,
PLONG Length)
{
ULONG ByteSize;
NTSTATUS Status = STATUS_SUCCESS;
/* Deduct the minimum written length */
*Length -= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel[0]);
/* Zero it */
RtlZeroMemory(Buffer, sizeof(FILE_FS_VOLUME_INFORMATION));
DPRINT("Serial number 0x%x, label length %d\n",
Vcb->Vpb->SerialNumber, Vcb->Vpb->VolumeLabelLength);
/* Save serial number */
Buffer->VolumeSerialNumber = Vcb->Vpb->SerialNumber;
/* Set max byte size */
ByteSize = Vcb->Vpb->VolumeLabelLength;
/* Check buffer length and reduce byte size if needed */
if (*Length < Vcb->Vpb->VolumeLabelLength)
{
/* Copy only up to what buffer size was provided */
ByteSize = *Length;
Status = STATUS_BUFFER_OVERFLOW;
}
/* Copy volume label */
Buffer->VolumeLabelLength = Vcb->Vpb->VolumeLabelLength;
RtlCopyMemory(Buffer->VolumeLabel, Vcb->Vpb->VolumeLabel, ByteSize);
*Length -= ByteSize;
return Status;
}
NTSTATUS
NTAPI
FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
{
PFILE_OBJECT FileObject;
PIO_STACK_LOCATION IrpSp;
FILE_INFORMATION_CLASS InfoClass;
TYPE_OF_OPEN FileType;
PVCB Vcb;
PFCB Fcb;
PCCB Ccb;
LONG Length;
PVOID Buffer;
BOOLEAN VcbLocked = FALSE;
NTSTATUS Status = STATUS_SUCCESS;
/* Get IRP stack location */
IrpSp = IoGetCurrentIrpStackLocation(Irp);
/* Get the file object */
FileObject = IrpSp->FileObject;
/* Copy variables to something with shorter names */
InfoClass = IrpSp->Parameters.QueryVolume.FsInformationClass;
Length = IrpSp->Parameters.QueryVolume.Length;
Buffer = Irp->AssociatedIrp.SystemBuffer;
DPRINT("FatiQueryVolumeInfo\n", 0);
DPRINT("\tIrp = %08lx\n", Irp);
DPRINT("\tLength = %08lx\n", Length);
DPRINT("\tFsInformationClass = %08lx\n", InfoClass);
DPRINT("\tBuffer = %08lx\n", Buffer);
FileType = FatDecodeFileObject(FileObject, &Vcb, &Fcb, &Ccb);
DPRINT("Vcb %p, Fcb %p, Ccb %p, open type %d\n", Vcb, Fcb, Ccb, FileType);
switch (InfoClass)
{
case FileFsVolumeInformation:
/* Acquired the shared VCB lock */
if (!FatAcquireSharedVcb(IrpContext, Vcb))
{
ASSERT(FALSE);
}
/* Remember we locked it */
VcbLocked = TRUE;
/* Call FsVolumeInfo handler */
Status = FatiQueryFsVolumeInfo(Vcb, Buffer, &Length);
break;
default:
DPRINT1("Volume information class %d is not supported!\n", InfoClass);
UNIMPLEMENTED;
}
/* Set IoStatus.Information to amount of filled bytes */
Irp->IoStatus.Information = IrpSp->Parameters.QueryVolume.Length - Length;
/* Release VCB lock */
if (VcbLocked) FatReleaseVcb(IrpContext, Vcb);
/* Complete request and return status */
FatCompleteRequest(IrpContext, Irp, Status);
return Status;
}
NTSTATUS
NTAPI
FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
DPRINT1("FatQueryVolumeInfo()\n");
return STATUS_NOT_IMPLEMENTED;
NTSTATUS Status;
BOOLEAN TopLevel, CanWait;
PFAT_IRP_CONTEXT IrpContext;
CanWait = TRUE;
TopLevel = FALSE;
Status = STATUS_INVALID_DEVICE_REQUEST;
/* Get CanWait flag */
if (IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL)
CanWait = IoIsOperationSynchronous(Irp);
/* Enter FsRtl critical region */
FsRtlEnterFileSystem();
/* Set Top Level IRP if not set */
if (IoGetTopLevelIrp() == NULL)
{
IoSetTopLevelIrp(Irp);
TopLevel = TRUE;
}
/* Build an irp context */
IrpContext = FatBuildIrpContext(Irp, CanWait);
/* Call the request handler */
Status = FatiQueryVolumeInfo(IrpContext, Irp);
/* Restore top level Irp */
if (TopLevel)
IoSetTopLevelIrp(NULL);
/* Leave FsRtl critical region */
FsRtlExitFileSystem();
return Status;
}
NTSTATUS
@@ -29,4 +171,27 @@ FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
return STATUS_NOT_IMPLEMENTED;
}
VOID
NTAPI
FatReadStreamFile(PVCB Vcb,
ULONGLONG ByteOffset,
ULONG ByteSize,
PBCB *Bcb,
PVOID *Buffer)
{
LARGE_INTEGER Offset;
Offset.QuadPart = ByteOffset;
if (!CcMapData(Vcb->StreamFileObject,
&Offset,
ByteSize,
TRUE, // FIXME: CanWait
Bcb,
Buffer))
{
ASSERT(FALSE);
}
}
/* EOF */
+4 -4
View File
@@ -691,7 +691,7 @@ NTAPI
BdaPropertyNodeDescriptors(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
OUT GUID *pguidProperty)
OUT BDANODE_DESCRIPTOR *pNodeDescriptorProperty)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
@@ -704,7 +704,7 @@ NTSTATUS
NTAPI
BdaPropertyNodeEvents(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty)
{
UNIMPLEMENTED
@@ -718,7 +718,7 @@ NTSTATUS
NTAPI
BdaPropertyNodeMethods(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty)
{
UNIMPLEMENTED
@@ -732,7 +732,7 @@ NTSTATUS
NTAPI
BdaPropertyNodeProperties(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty)
{
UNIMPLEMENTED
@@ -2308,7 +2308,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
PCHAR BootDeviceName, CommandLine;
PDEVICE_OBJECT PhysicalDeviceObject = NULL;
NTSTATUS Status;
DPRINT1("RAM Disk Driver Initialized\n");
DPRINT("RAM Disk Driver Initialized\n");
//
// Query ramdisk parameters
@@ -119,7 +119,7 @@ TestKs()
// Allocate a KS Pin Connection Request Structure
//
Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX);
printf("Length %ld KSPIN %u DATAFORAMT %u\n", Length, sizeof(KSPIN_CONNECT), sizeof(KSDATAFORMAT_WAVEFORMATEX));
printf("Length %ld KSPIN %u DATAFORMAT %u\n", Length, sizeof(KSPIN_CONNECT), sizeof(KSDATAFORMAT_WAVEFORMATEX));
PinConnect = (PKSPIN_CONNECT)HeapAlloc(GetProcessHeap(), 0, Length);
DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)(PinConnect + 1);
@@ -238,8 +238,8 @@ NTAPI
PcDmaSlaveDescription(
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex,
IN BOOL DemandMode,
IN ULONG AutoInitialize,
IN BOOLEAN DemandMode,
IN BOOLEAN AutoInitialize,
IN DMA_SPEED DmaSpeed,
IN ULONG MaximumLength,
IN ULONG DmaPort,
@@ -156,7 +156,7 @@ RegisterConnection(
IN PUNICODE_STRING ToString,
IN ULONG ToPin)
{
PSUBDEVICE_DESCRIPTOR FromSubDeviceDescriptor, ToSubDeviceDescriptor;
PSUBDEVICE_DESCRIPTOR FromSubDeviceDescriptor = NULL, ToSubDeviceDescriptor = NULL;
PSYMBOLICLINK_ENTRY SymEntry;
ISubdevice * FromSubDevice = NULL, *ToSubDevice = NULL;
NTSTATUS Status;
@@ -205,35 +205,49 @@ RegisterConnection(
}
FromEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + ToString->MaximumLength, TAG_PORTCLASS);
if (!FromEntry)
if (FromSubDeviceDescriptor)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
FromEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + ToString->MaximumLength, TAG_PORTCLASS);
if (!FromEntry)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
}
}
ToEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + FromString->MaximumLength, TAG_PORTCLASS);
if (!ToEntry)
if (ToSubDeviceDescriptor)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
ToEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + FromString->MaximumLength, TAG_PORTCLASS);
if (!ToEntry)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
}
}
FromEntry->FromPin = FromPin;
FromEntry->Connection.Pin = ToPin;
FromEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + ToString->MaximumLength;
RtlMoveMemory(&FromEntry->Connection.SymbolicLinkName, ToString->Buffer, ToString->MaximumLength);
FromEntry->Connection.SymbolicLinkName[ToString->Length / sizeof(WCHAR)] = L'\0';
if (FromSubDeviceDescriptor)
{
FromEntry->FromPin = FromPin;
FromEntry->Connection.Pin = ToPin;
FromEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + ToString->MaximumLength;
RtlMoveMemory(&FromEntry->Connection.SymbolicLinkName, ToString->Buffer, ToString->MaximumLength);
FromEntry->Connection.SymbolicLinkName[ToString->Length / sizeof(WCHAR)] = L'\0';
ToEntry->FromPin = ToPin;
ToEntry->Connection.Pin = FromPin;
ToEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + FromString->MaximumLength;
RtlMoveMemory(&ToEntry->Connection.SymbolicLinkName, FromString->Buffer, FromString->MaximumLength);
ToEntry->Connection.SymbolicLinkName[FromString->Length / sizeof(WCHAR)] = L'\0';
InsertTailList(&FromSubDeviceDescriptor->PhysicalConnectionList, &FromEntry->Entry);
}
InsertTailList(&FromSubDeviceDescriptor->PhysicalConnectionList, &FromEntry->Entry);
InsertTailList(&ToSubDeviceDescriptor->PhysicalConnectionList, &ToEntry->Entry);
if (ToSubDeviceDescriptor)
{
ToEntry->FromPin = ToPin;
ToEntry->Connection.Pin = FromPin;
ToEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + FromString->MaximumLength;
RtlMoveMemory(&ToEntry->Connection.SymbolicLinkName, FromString->Buffer, FromString->MaximumLength);
ToEntry->Connection.SymbolicLinkName[FromString->Length / sizeof(WCHAR)] = L'\0';
InsertTailList(&ToSubDeviceDescriptor->PhysicalConnectionList, &ToEntry->Entry);
}
return STATUS_SUCCESS;
@@ -679,6 +679,10 @@ typedef IPortPinWavePci *PPORTPINWAVEPCI;
#undef INTERFACE
#define INTERFACE IPortFilterWaveRT
#ifndef PPORTWAVERT
typedef IPortWaveRT *PPORTWAVERT;
#endif
DECLARE_INTERFACE_(IPortFilterWaveRT, IIrpTarget)
{
DEFINE_ABSTRACT_UNKNOWN()
@@ -1103,4 +1107,15 @@ DECLARE_INTERFACE_(IPortWaveRTStreamInit, IUnknown)
IN ULONG Index \
)
#ifndef IMP_IPortClsVersion
#define IMP_IPortClsVersion \
STDMETHODIMP_(DWORD) GetVersion(void);
#endif
#ifdef IMP_IPortWaveRT
#define IMP_IPortWaveRT IMP_IPort
#endif
#endif
@@ -97,8 +97,10 @@ CInterruptSynchronizedRoutine(
IN PVOID ServiceContext)
{
CInterruptSync * This = (CInterruptSync*)ServiceContext;
DPRINT("CInterruptSynchronizedRoutine this %p SyncRoutine %p Context %p\n", This, This->m_SyncRoutine, This->m_DynamicContext);
return This->m_SyncRoutine(This, This->m_DynamicContext);
NTSTATUS Status = This->m_SyncRoutine(This, This->m_DynamicContext);
DPRINT("CInterruptSynchronizedRoutine this %p SyncRoutine %p Context %p Status %x\n", This, This->m_SyncRoutine, This->m_DynamicContext, Status);
return NT_SUCCESS(Status);
}
NTSTATUS
@@ -155,10 +157,10 @@ IInterruptServiceRoutine(
NTSTATUS Status;
BOOL Success;
//DPRINT("IInterruptServiceRoutine Mode %u\n", m_Mode);
CInterruptSync * This = (CInterruptSync*)ServiceContext;
DPRINT("IInterruptServiceRoutine Mode %u\n", This->m_Mode);
if (This->m_Mode == InterruptSyncModeNormal)
{
CurEntry = This->m_ServiceRoutines.Flink;
@@ -234,8 +236,8 @@ CInterruptSync::Connect()
(PVOID)this,
&m_Lock,
Descriptor->u.Interrupt.Vector,
Descriptor->u.Interrupt.Level,
Descriptor->u.Interrupt.Level,
(KIRQL)Descriptor->u.Interrupt.Level,
(KIRQL)Descriptor->u.Interrupt.Level,
(KINTERRUPT_MODE)(Descriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED),
(Descriptor->Flags != CM_RESOURCE_INTERRUPT_LATCHED),
Descriptor->u.Interrupt.Affinity,
@@ -118,7 +118,10 @@ CIrpQueue::AddMapping(
// ioctl from KsStudio
// Wdmaud already probes buffers, therefore no need to probe it again
// probe the stream irp
Status = KsProbeStreamIrp(Irp, KSSTREAM_READ | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_ALLOWFORMATCHANGE | KSPROBE_SYSTEMADDRESS, 0);
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM)
Status = KsProbeStreamIrp(Irp, KSSTREAM_WRITE | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_ALLOWFORMATCHANGE | KSPROBE_SYSTEMADDRESS, 0);
else
Status = KsProbeStreamIrp(Irp, KSSTREAM_READ| KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_ALLOWFORMATCHANGE | KSPROBE_SYSTEMADDRESS, 0);
// check for success
if (!NT_SUCCESS(Status))
@@ -200,8 +203,7 @@ CIrpQueue::GetMapping(
if (!Irp)
{
DPRINT1("NoIrp\n");
return STATUS_UNSUCCESSFUL;
DPRINT("NoIrp\n");
// no irp available, use silence buffer
*Buffer = (PUCHAR)m_SilenceBuffer;
*BufferSize = m_MaxFrameSize;
@@ -358,7 +358,7 @@ CPortPinDMus::TransferMidiDataToDMus()
//set up struct
//Event->Event.usFlags = DMUS_KEF_EVENT_COMPLETE;
Event->Event.cbStruct = sizeof(DMUS_KERNEL_EVENT);
Event->Event.cbEvent = BufferSize;
Event->Event.cbEvent = (USHORT)BufferSize;
Event->Event.uData.pbData = (PBYTE)Buffer;
@@ -51,6 +51,7 @@ protected:
friend NTSTATUS NTAPI PinWaveCyclicState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
IPortWaveCyclic * m_Port;
IPortFilterWaveCyclic * m_Filter;
@@ -75,6 +76,7 @@ protected:
ULONG m_TotalPackets;
ULONG m_StopCount;
KSAUDIO_POSITION m_Position;
KSALLOCATOR_FRAMING m_AllocatorFraming;
SUBDEVICE_DESCRIPTOR m_Descriptor;
ULONG m_Delay;
@@ -93,9 +95,9 @@ typedef struct
NTSTATUS NTAPI PinWaveCyclicState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWaveCyclicDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWaveCyclicAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWaveCyclicAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat);
DEFINE_KSPROPERTY_CONNECTIONSET(PinWaveCyclicConnectionSet, PinWaveCyclicState, PinWaveCyclicDataFormat, PinWaveCyclicAllocatorFraming);
DEFINE_KSPROPERTY_AUDIOSET(PinWaveCyclicAudioSet, PinWaveCyclicAudioPosition);
KSPROPERTY_SET PinWaveCyclicPropertySet[] =
@@ -144,7 +146,40 @@ CPortPinWaveCyclic::QueryInterface(
return STATUS_UNSUCCESSFUL;
}
NTSTATUS
NTAPI
PinWaveCyclicAllocatorFraming(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
CPortPinWaveCyclic *Pin;
PSUBDEVICE_DESCRIPTOR Descriptor;
// get sub device descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
// sanity check
PC_ASSERT(Descriptor);
PC_ASSERT(Descriptor->PortPin);
PC_ASSERT_IRQL(DISPATCH_LEVEL);
// cast to pin impl
Pin = (CPortPinWaveCyclic*)Descriptor->PortPin;
if (Request->Flags & KSPROPERTY_TYPE_GET)
{
// copy pin framing
RtlMoveMemory(Data, &Pin->m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
return STATUS_SUCCESS;
}
// not supported
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
@@ -579,7 +614,7 @@ CPortPinWaveCyclic::RequestService()
}
Status = m_Stream->GetPosition(&Position);
DPRINT1("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
if (Position < m_CommonBufferOffset)
{
@@ -958,8 +993,9 @@ CPortPinWaveCyclic::Init(
NTSTATUS Status;
PKSDATAFORMAT DataFormat;
PDEVICE_OBJECT DeviceObject;
BOOL Capture;
BOOLEAN Capture;
PVOID SilenceBuffer;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
//IDrmAudioStream * DrmAudio = NULL;
m_KsPinDescriptor = KsPinDescriptor;
@@ -1015,6 +1051,8 @@ CPortPinWaveCyclic::Init(
}
#endif
DPRINT("CPortPinWaveCyclic::Init Status %x\n", Status);
if (!NT_SUCCESS(Status))
return Status;
@@ -1025,8 +1063,6 @@ CPortPinWaveCyclic::Init(
if (!NT_SUCCESS(Status))
return Status;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
Status = Subdevice->GetDescriptor(&SubDeviceDescriptor);
if (!NT_SUCCESS(Status))
{
@@ -1044,11 +1080,10 @@ CPortPinWaveCyclic::Init(
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
m_Descriptor.PortPin = (PVOID)this;
DPRINT("CPortPinWaveCyclic::Init Status %x\n", Status);
// release subdevice descriptor
Subdevice->Release();
// add ourselves to service group
Status = m_ServiceGroup->AddMember(PSERVICESINK(this));
if (!NT_SUCCESS(Status))
{
@@ -1072,6 +1107,15 @@ CPortPinWaveCyclic::Init(
if (!SilenceBuffer)
return STATUS_INSUFFICIENT_RESOURCES;
/* set up allocator framing */
m_AllocatorFraming.RequirementsFlags = KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY | KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY;
m_AllocatorFraming.PoolType = NonPagedPool;
m_AllocatorFraming.Frames = 8;
m_AllocatorFraming.FileAlignment = FILE_64_BYTE_ALIGNMENT;
m_AllocatorFraming.Reserved = 0;
m_AllocatorFraming.FrameSize = m_FrameSize;
m_Stream->Silence(SilenceBuffer, m_FrameSize);
Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, m_FrameSize, 0, SilenceBuffer);
@@ -41,6 +41,11 @@ public:
VOID NTAPI CloseStream();
protected:
friend NTSTATUS NTAPI PinWavePciState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWavePciDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWavePciAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
friend NTSTATUS NTAPI PinWavePciAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
IPortWavePci * m_Port;
IPortFilterWavePci * m_Filter;
KSPIN_DESCRIPTOR * m_KsPinDescriptor;
@@ -57,20 +62,23 @@ protected:
IIrpQueue * m_IrpQueue;
ULONG m_TotalPackets;
ULONG m_PreCompleted;
ULONG m_PostCompleted;
KSAUDIO_POSITION m_Position;
ULONG m_StopCount;
ULONG m_Delay;
BOOL m_bUsePrefetch;
ULONG m_PrefetchOffset;
SUBDEVICE_DESCRIPTOR m_Descriptor;
KSALLOCATOR_FRAMING m_AllocatorFraming;
LONG m_Ref;
NTSTATUS NTAPI HandleKsProperty(IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN PIO_STATUS_BLOCK IoStatusBlock);
NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp);
NTSTATUS NTAPI HandleKsStream(IN PIRP Irp);
VOID NTAPI SetStreamState( IN KSSTATE State);
};
@@ -81,6 +89,283 @@ typedef struct
KSSTATE State;
}SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
NTSTATUS NTAPI PinWavePciState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWavePciDataFormat(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWavePciAudioPosition(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI PinWavePciAllocatorFraming(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
DEFINE_KSPROPERTY_CONNECTIONSET(PinWavePciConnectionSet, PinWavePciState, PinWavePciDataFormat, PinWavePciAllocatorFraming);
DEFINE_KSPROPERTY_AUDIOSET(PinWavePciAudioSet, PinWavePciAudioPosition);
KSPROPERTY_SET PinWavePciPropertySet[] =
{
{
&KSPROPSETID_Connection,
sizeof(PinWavePciConnectionSet) / sizeof(KSPROPERTY_ITEM),
(const KSPROPERTY_ITEM*)&PinWavePciConnectionSet,
0,
NULL
},
{
&KSPROPSETID_Audio,
sizeof(PinWavePciAudioSet) / sizeof(KSPROPERTY_ITEM),
(const KSPROPERTY_ITEM*)&PinWavePciAudioSet,
0,
NULL
}
};
NTSTATUS
NTAPI
PinWavePciAllocatorFraming(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
CPortPinWavePci *Pin;
PSUBDEVICE_DESCRIPTOR Descriptor;
// get sub device descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
// sanity check
PC_ASSERT(Descriptor);
PC_ASSERT(Descriptor->PortPin);
PC_ASSERT_IRQL(DISPATCH_LEVEL);
// cast to pin impl
Pin = (CPortPinWavePci*)Descriptor->PortPin;
if (Request->Flags & KSPROPERTY_TYPE_GET)
{
// copy pin framing
RtlMoveMemory(Data, &Pin->m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
return STATUS_SUCCESS;
}
// not supported
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
PinWavePciAudioPosition(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
CPortPinWavePci *Pin;
PSUBDEVICE_DESCRIPTOR Descriptor;
// get sub device descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
// sanity check
PC_ASSERT(Descriptor);
PC_ASSERT(Descriptor->PortPin);
PC_ASSERT_IRQL(DISPATCH_LEVEL);
// cast to pin impl
Pin = (CPortPinWavePci*)Descriptor->PortPin;
//sanity check
PC_ASSERT(Pin->m_Stream);
if (Request->Flags & KSPROPERTY_TYPE_GET)
{
// FIXME non multithreading-safe
// copy audio position
RtlMoveMemory(Data, &Pin->m_Position, sizeof(KSAUDIO_POSITION));
DPRINT1("Play %lu Record %lu\n", Pin->m_Position.PlayOffset, Pin->m_Position.WriteOffset);
Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION);
return STATUS_SUCCESS;
}
// not supported
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
PinWavePciState(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
CPortPinWavePci *Pin;
PSUBDEVICE_DESCRIPTOR Descriptor;
PKSSTATE State = (PKSSTATE)Data;
// get sub device descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
// sanity check
PC_ASSERT(Descriptor);
PC_ASSERT(Descriptor->PortPin);
PC_ASSERT_IRQL(DISPATCH_LEVEL);
// cast to pin impl
Pin = (CPortPinWavePci*)Descriptor->PortPin;
//sanity check
PC_ASSERT(Pin->m_Stream);
if (Request->Flags & KSPROPERTY_TYPE_SET)
{
// try set stream
Status = Pin->m_Stream->SetState(*State);
DPRINT("Setting state %u %x\n", *State, Status);
if (NT_SUCCESS(Status))
{
// store new state
Pin->m_State = *State;
}
// store result
Irp->IoStatus.Information = sizeof(KSSTATE);
return Status;
}
else if (Request->Flags & KSPROPERTY_TYPE_GET)
{
// get current stream state
*State = Pin->m_State;
// store result
Irp->IoStatus.Information = sizeof(KSSTATE);
return STATUS_SUCCESS;
}
// unsupported request
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
PinWavePciDataFormat(
IN PIRP Irp,
IN PKSIDENTIFIER Request,
IN OUT PVOID Data)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
CPortPinWavePci *Pin;
PSUBDEVICE_DESCRIPTOR Descriptor;
PIO_STACK_LOCATION IoStack;
// get current irp stack location
IoStack = IoGetCurrentIrpStackLocation(Irp);
// get sub device descriptor
Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
// sanity check
PC_ASSERT(Descriptor);
PC_ASSERT(Descriptor->PortPin);
// cast to pin impl
Pin = (CPortPinWavePci*)Descriptor->PortPin;
//sanity check
PC_ASSERT(Pin->m_Stream);
PC_ASSERT(Pin->m_Format);
if (Request->Flags & KSPROPERTY_TYPE_SET)
{
// try to change data format
PKSDATAFORMAT NewDataFormat, DataFormat = (PKSDATAFORMAT)Irp->UserBuffer;
ULONG Size = min(Pin->m_Format->FormatSize, DataFormat->FormatSize);
if (RtlCompareMemory(DataFormat, Pin->m_Format, Size) == Size)
{
// format is identical
Irp->IoStatus.Information = DataFormat->FormatSize;
return STATUS_SUCCESS;
}
// new change request
PC_ASSERT(Pin->m_State == KSSTATE_STOP);
// FIXME queue a work item when Irql != PASSIVE_LEVEL
PC_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
// allocate new data format
NewDataFormat = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
if (!NewDataFormat)
{
// not enough memory
return STATUS_NO_MEMORY;
}
// copy new data format
RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize);
// set new format
Status = Pin->m_Stream->SetFormat(NewDataFormat);
if (NT_SUCCESS(Status))
{
// free old format
FreeItem(Pin->m_Format, TAG_PORTCLASS);
// update irp queue with new format
Pin->m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat);
// store new format
Pin->m_Format = NewDataFormat;
Irp->IoStatus.Information = NewDataFormat->FormatSize;
#if 0
PC_ASSERT(NewDataFormat->FormatSize == sizeof(KSDATAFORMAT_WAVEFORMATEX));
PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.MajorFormat, KSDATAFORMAT_TYPE_AUDIO));
PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat, KSDATAFORMAT_SUBTYPE_PCM));
PC_ASSERT(IsEqualGUIDAligned(((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier, KSDATAFORMAT_SPECIFIER_WAVEFORMATEX));
DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
#endif
}
else
{
// failed to set format
FreeItem(NewDataFormat, TAG_PORTCLASS);
}
// done
return Status;
}
else if (Request->Flags & KSPROPERTY_TYPE_GET)
{
// get current data format
PC_ASSERT(Pin->m_Format);
if (Pin->m_Format->FormatSize > IoStack->Parameters.DeviceIoControl.OutputBufferLength)
{
// buffer too small
Irp->IoStatus.Information = Pin->m_Format->FormatSize;
return STATUS_MORE_ENTRIES;
}
// copy data format
RtlMoveMemory(Data, Pin->m_Format, Pin->m_Format->FormatSize);
// store result size
Irp->IoStatus.Information = Pin->m_Format->FormatSize;
// done
return STATUS_SUCCESS;
}
// unsupported request
return STATUS_NOT_SUPPORTED;
}
//==================================================================================================================================
NTSTATUS
NTAPI
@@ -185,7 +470,7 @@ CPortPinWavePci::SetState(KSSTATE State)
// store minimum data threshold
m_IrpQueue->SetMinimumDataThreshold(MinimumDataThreshold);
DPRINT1("Stopping PreCompleted %u PostCompleted %u StopCount %u MinimumDataThreshold %u\n", m_PreCompleted, m_PostCompleted, m_StopCount, MinimumDataThreshold);
DPRINT1("Stopping TotalCompleted %u StopCount %u MinimumDataThreshold %u\n", m_TotalPackets, m_StopCount, MinimumDataThreshold);
}
if (m_State == KSSTATE_RUN)
{
@@ -308,144 +593,50 @@ CPortPinWavePci::NewIrpTarget(
NTSTATUS
NTAPI
CPortPinWavePci::HandleKsProperty(
IN PVOID InputBuffer,
IN ULONG InputBufferLength,
IN PVOID OutputBuffer,
IN ULONG OutputBufferLength,
IN PIO_STATUS_BLOCK IoStatusBlock)
IN PIRP Irp)
{
PKSPROPERTY Property;
NTSTATUS Status;
UNICODE_STRING GuidString;
PIO_STACK_LOCATION IoStack;
DPRINT("IPortPinWavePci_HandleKsProperty entered\n");
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (InputBufferLength < sizeof(KSPROPERTY))
DPRINT("IPortPinWave_HandleKsProperty entered\n");
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
{
IoStatusBlock->Information = 0;
IoStatusBlock->Status = STATUS_INVALID_PARAMETER;
return STATUS_INVALID_PARAMETER;
DPRINT1("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
Property = (PKSPROPERTY)InputBuffer;
Status = PcHandlePropertyWithTable(Irp, m_Descriptor.FilterPropertySetCount, m_Descriptor.FilterPropertySet, &m_Descriptor);
if (IsEqualGUIDAligned(Property->Set, KSPROPSETID_Connection))
if (Status == STATUS_NOT_FOUND)
{
if (Property->Id == KSPROPERTY_CONNECTION_STATE)
{
PKSSTATE State = (PKSSTATE)OutputBuffer;
Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
PC_ASSERT_IRQL(DISPATCH_LEVEL);
if (OutputBufferLength < sizeof(KSSTATE))
{
IoStatusBlock->Information = sizeof(KSSTATE);
IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
return STATUS_BUFFER_TOO_SMALL;
}
RtlStringFromGUID(Property->Set, &GuidString);
DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
RtlFreeUnicodeString(&GuidString);
}
if (Property->Flags & KSPROPERTY_TYPE_SET)
{
Status = STATUS_UNSUCCESSFUL;
IoStatusBlock->Information = 0;
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
if (m_Stream)
{
Status = m_Stream->SetState(*State);
return Status;
}
DPRINT1("Setting state %u %x\n", *State, Status);
if (NT_SUCCESS(Status))
{
m_State = *State;
}
}
IoStatusBlock->Status = Status;
return Status;
}
else if (Property->Flags & KSPROPERTY_TYPE_GET)
{
*State = m_State;
IoStatusBlock->Information = sizeof(KSSTATE);
IoStatusBlock->Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
}
else if (Property->Id == KSPROPERTY_CONNECTION_DATAFORMAT)
{
PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)OutputBuffer;
if (Property->Flags & KSPROPERTY_TYPE_SET)
{
PKSDATAFORMAT NewDataFormat;
if (!RtlCompareMemory(DataFormat, m_Format, DataFormat->FormatSize))
{
IoStatusBlock->Information = DataFormat->FormatSize;
IoStatusBlock->Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
NewDataFormat = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
if (!NewDataFormat)
{
IoStatusBlock->Information = 0;
IoStatusBlock->Status = STATUS_NO_MEMORY;
return STATUS_NO_MEMORY;
}
RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize);
if (m_Stream)
{
#if 0
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
ASSERT(NewDataFormat->FormatSize == sizeof(KSDATAFORMAT_WAVEFORMATEX));
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO));
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM));
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX));
ASSERT(This->State == KSSTATE_STOP);
#endif
DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
Status = m_Stream->SetFormat(NewDataFormat);
if (NT_SUCCESS(Status))
{
if (m_Format)
ExFreePoolWithTag(m_Format, TAG_PORTCLASS);
m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat);
m_Format = NewDataFormat;
IoStatusBlock->Information = DataFormat->FormatSize;
IoStatusBlock->Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
}
DPRINT1("Failed to set format\n");
IoStatusBlock->Information = 0;
IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
return STATUS_UNSUCCESSFUL;
}
else if (Property->Flags & KSPROPERTY_TYPE_GET)
{
if (!m_Format)
{
DPRINT1("No format\n");
IoStatusBlock->Information = 0;
IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
return STATUS_UNSUCCESSFUL;
}
if (m_Format->FormatSize > OutputBufferLength)
{
IoStatusBlock->Information = m_Format->FormatSize;
IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
return STATUS_BUFFER_TOO_SMALL;
}
RtlMoveMemory(DataFormat, m_Format, m_Format->FormatSize);
IoStatusBlock->Information = DataFormat->FormatSize;
IoStatusBlock->Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
}
}
else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
{
PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)OutputBuffer;
@@ -466,16 +657,38 @@ CPortPinWavePci::HandleKsProperty(
return STATUS_SUCCESS;
}
}
#endif
RtlStringFromGUID(Property->Set, &GuidString);
DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
RtlFreeUnicodeString(&GuidString);
NTSTATUS
NTAPI
CPortPinWavePci::HandleKsStream(
IN PIRP Irp)
{
NTSTATUS Status;
InterlockedIncrement((PLONG)&m_TotalPackets);
IoStatusBlock->Status = STATUS_NOT_IMPLEMENTED;
IoStatusBlock->Information = 0;
return STATUS_NOT_IMPLEMENTED;
DPRINT("IPortPinWaveCyclic_HandleKsStream entered Total %u State %x MinData %u\n", m_TotalPackets, m_State, m_IrpQueue->NumData());
Status = m_IrpQueue->AddMapping(NULL, 0, Irp);
if (NT_SUCCESS(Status))
{
PKSSTREAM_HEADER Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer;
PC_ASSERT(Header);
if (m_Capture)
m_Position.WriteOffset += Header->FrameExtent;
else
m_Position.WriteOffset += Header->DataUsed;
}
return STATUS_PENDING;
}
NTSTATUS
NTAPI
CPortPinWavePci::DeviceIoControl(
@@ -483,17 +696,17 @@ CPortPinWavePci::DeviceIoControl(
IN PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
NTSTATUS Status;
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
{
Status = HandleKsProperty(IoStack->Parameters.DeviceIoControl.Type3InputBuffer, IoStack->Parameters.DeviceIoControl.InputBufferLength, Irp->UserBuffer, IoStack->Parameters.DeviceIoControl.OutputBufferLength, &Irp->IoStatus);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
return HandleKsProperty(Irp);
}
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM || IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM)
{
return HandleKsStream(Irp);
}
UNIMPLEMENTED
@@ -735,7 +948,7 @@ CPortPinWavePci::Init(
{
NTSTATUS Status;
PKSDATAFORMAT DataFormat;
BOOL Capture;
BOOLEAN Capture;
Port->AddRef();
Filter->AddRef();
@@ -810,6 +1023,34 @@ CPortPinWavePci::Init(
DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n",
m_AllocatorFraming.OptionsFlags, m_AllocatorFraming.RequirementsFlags, m_AllocatorFraming.PoolType, m_AllocatorFraming.Frames, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment);
ISubdevice * Subdevice = NULL;
// get subdevice interface
Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&Subdevice);
if (!NT_SUCCESS(Status))
return Status;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor = NULL;
Status = Subdevice->GetDescriptor(&SubDeviceDescriptor);
if (!NT_SUCCESS(Status))
{
// failed to get descriptor
Subdevice->Release();
return Status;
}
/* set up subdevice descriptor */
RtlZeroMemory(&m_Descriptor, sizeof(SUBDEVICE_DESCRIPTOR));
m_Descriptor.FilterPropertySet = PinWavePciPropertySet;
m_Descriptor.FilterPropertySetCount = sizeof(PinWavePciPropertySet) / sizeof(KSPROPERTY_SET);
m_Descriptor.UnknownStream = (PUNKNOWN)m_Stream;
m_Descriptor.DeviceDescriptor = SubDeviceDescriptor->DeviceDescriptor;
m_Descriptor.UnknownMiniport = SubDeviceDescriptor->UnknownMiniport;
m_Descriptor.PortPin = (PVOID)this;
Status = NewIrpQueue(&m_IrpQueue);
if (!NT_SUCCESS(Status))
return Status;
@@ -8,8 +8,7 @@
#include "private.hpp"
class CPortPinWaveRT : public IPortPinWaveRT,
public IServiceSink //hack
class CPortPinWaveRT : public IPortPinWaveRT
{
public:
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
@@ -31,7 +30,6 @@ public:
return m_Ref;
}
IMP_IPortPinWaveRT;
IMP_IServiceSink; //HACK
CPortPinWaveRT(IUnknown *OuterUnknown){}
virtual ~CPortPinWaveRT(){}
@@ -43,7 +41,6 @@ protected:
PMINIPORTWAVERT m_Miniport;
PMINIPORTWAVERTSTREAM m_Stream;
PPORTWAVERTSTREAM m_PortStream;
PSERVICEGROUP m_ServiceGroup;
KSSTATE m_State;
PKSDATAFORMAT m_Format;
KSPIN_CONNECT * m_ConnectDetails;
@@ -70,8 +67,6 @@ protected:
NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp);
NTSTATUS NTAPI HandleKsStream(IN PIRP Irp);
VOID NTAPI SetStreamState(IN KSSTATE State);
VOID UpdateCommonBuffer(ULONG Position);
VOID UpdateCommonBufferOverlap(ULONG Position);
friend VOID NTAPI SetStreamWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
friend VOID NTAPI CloseStreamRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
@@ -86,81 +81,6 @@ typedef struct
}SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
VOID
CPortPinWaveRT::UpdateCommonBuffer(
ULONG Position)
{
ULONG BufferLength;
ULONG BytesToCopy;
ULONG BufferSize;
PUCHAR Buffer;
NTSTATUS Status;
BufferLength = Position - m_CommonBufferOffset;
while(BufferLength)
{
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
return;
BytesToCopy = min(BufferLength, BufferSize);
if (m_Capture)
{
RtlMoveMemory(Buffer, (PUCHAR)m_CommonBuffer + m_CommonBufferOffset, BytesToCopy);
}
else
{
RtlMoveMemory((PUCHAR)m_CommonBuffer + m_CommonBufferOffset, Buffer, BytesToCopy);
}
m_IrpQueue->UpdateMapping(BytesToCopy);
m_CommonBufferOffset += BytesToCopy;
BufferLength = Position - m_CommonBufferOffset;
}
}
VOID
CPortPinWaveRT::UpdateCommonBufferOverlap(
ULONG Position)
{
ULONG BufferLength;
ULONG BytesToCopy;
ULONG BufferSize;
PUCHAR Buffer;
NTSTATUS Status;
BufferLength = m_CommonBufferSize - m_CommonBufferOffset;
while(BufferLength)
{
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
return;
BytesToCopy = min(BufferLength, BufferSize);
if (m_Capture)
{
RtlMoveMemory(Buffer, (PUCHAR)m_CommonBuffer + m_CommonBufferOffset, BytesToCopy);
}
else
{
RtlMoveMemory((PUCHAR)m_CommonBuffer + m_CommonBufferOffset, Buffer, BytesToCopy);
}
m_IrpQueue->UpdateMapping(BytesToCopy);
m_CommonBufferOffset += BytesToCopy;
BufferLength = m_CommonBufferSize - m_CommonBufferOffset;
}
m_CommonBufferOffset = 0;
UpdateCommonBuffer(Position);
}
//==================================================================================================================================
NTSTATUS
NTAPI
@@ -170,13 +90,6 @@ CPortPinWaveRT::QueryInterface(
{
DPRINT("IServiceSink_fnQueryInterface entered\n");
if (IsEqualGUIDAligned(refiid, IID_IServiceSink))
{
*Output = PVOID(PSERVICEGROUP(this));
PUNKNOWN(*Output)->AddRef();
return STATUS_SUCCESS;
}
if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
IsEqualGUIDAligned(refiid, IID_IUnknown))
{
@@ -187,37 +100,6 @@ CPortPinWaveRT::QueryInterface(
return STATUS_UNSUCCESSFUL;
}
VOID
NTAPI
CPortPinWaveRT::RequestService()
{
KSAUDIO_POSITION Position;
NTSTATUS Status;
PUCHAR Buffer;
ULONG BufferSize;
PC_ASSERT_IRQL(DISPATCH_LEVEL);
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
if (!NT_SUCCESS(Status))
{
SetStreamState(KSSTATE_STOP);
return;
}
Status = m_Stream->GetPosition(&Position);
DPRINT("PlayOffset %lu WriteOffset %lu Buffer %p BufferSize %u CommonBufferSize %u\n", Position.PlayOffset, Position.WriteOffset, Buffer, BufferSize, m_CommonBufferSize);
if (Position.PlayOffset < m_CommonBufferOffset)
{
UpdateCommonBufferOverlap(Position.PlayOffset);
}
else if (Position.PlayOffset >= m_CommonBufferOffset)
{
UpdateCommonBuffer(Position.PlayOffset);
}
}
VOID
NTAPI
SetStreamWorkerRoutine(
@@ -248,14 +130,12 @@ SetStreamWorkerRoutine(
{
// reset start stream
This->m_IrpQueue->CancelBuffers(); //FIX function name
This->m_ServiceGroup->CancelDelayedService();
DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", This->m_PreCompleted, This->m_PostCompleted);
}
if (This->m_State == KSSTATE_RUN)
{
// start the notification timer
This->m_ServiceGroup->RequestDelayedService(This->m_Delay);
}
}
}
@@ -766,7 +646,7 @@ CPortPinWaveRT::Init(
{
NTSTATUS Status;
PKSDATAFORMAT DataFormat;
BOOL Capture;
BOOLEAN Capture;
KSRTAUDIO_HWLATENCY Latency;
Port->AddRef();
@@ -806,15 +686,6 @@ CPortPinWaveRT::Init(
goto cleanup;
}
Status = PcNewServiceGroup(&m_ServiceGroup, NULL);
if (!NT_SUCCESS(Status))
{
goto cleanup;
}
m_ServiceGroup->AddMember(PSERVICESINK(this));
m_ServiceGroup->SupportDelayedService();
if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
{
Capture = FALSE;
@@ -1,38 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: drivers/multimedia/portcls/port/port.h
* PURPOSE: Port Class driver / Private header for IPort
* PROGRAMMER: Andrew Greenwood
*
* HISTORY:
* 27 Jan 07 Created
*/
/*
Private header for Port implementations
*/
#ifndef PORT_PRIVATE_H
#define PORT_PRIVATE_H
#include "private.h"
#include <stdunk.h>
#include <portcls.h>
#if 0
typedef struct CPort
{
union
{
IUnknown IUnknown;
IPort IPort;
};
LONG m_ref_count;
PUNKNOWN m_outer_unknown;
} CPort;
#endif
#endif
@@ -1,72 +0,0 @@
/*
ReactOS Operating System
Port Class API / Port Factory
by Andrew Greenwood
*/
#define INITGUID
#include "private.h"
#include <portcls.h>
#include <ks.h>
#include <kcom.h>
#include "port.h"
/*
* @unimplemented
*/
PORTCLASSAPI NTSTATUS NTAPI
PcNewPort(
OUT PPORT* OutPort,
IN REFCLSID ClassId)
{
/*
ClassId can be one of the following:
CLSID_PortDMus -> IPortDMus (dmusicks.h) -- TODO
CLSID_PortMidi -> IPortMidi
CLSID_PortTopology -> IPortTopology
CLSID_PortWaveCyclic -> IPortWaveCyclic
CLSID_PortWavePci -> IPortWavePci
TODO: What about PortWavePciStream?
*/
PPORT new_port = NULL;
NTSTATUS status = STATUS_UNSUCCESSFUL;
if ( ! OutPort )
{
DPRINT("PcNewPort was supplied a NULL OutPort parameter\n");
return STATUS_INVALID_PARAMETER;
}
if ( ( IsEqualGUIDAligned(ClassId, &CLSID_PortMidi) ) ||
( IsEqualGUIDAligned(ClassId, &CLSID_PortTopology) ) ||
( IsEqualGUIDAligned(ClassId, &CLSID_PortWaveCyclic) ) ||
( IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci) ) )
{
DPRINT("Calling KoCreateInstance\n");
/* Call KS.SYS's Kernel-mode COM function */
status = KoCreateInstance(ClassId, NULL, CLSCTX_KERNEL_SERVER, &IID_IPort, (PVOID*)&new_port);
}
else
{
DPRINT("PcNewPort received a CLSID it does not deal with\n");
status = STATUS_NOT_SUPPORTED;
}
/* If an unsupported CLSID was handed to us, or the creation failed, we fail */
if ( status != STATUS_SUCCESS )
{
return status;
}
/* Fill the caller's PPORT* to point to the new port */
*OutPort = new_port;
DPRINT("PcNewPort succeeded\n");
return STATUS_SUCCESS;
}
@@ -355,8 +355,8 @@ CPortWaveCyclic::NewMasterDmaChannel(
IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG MaximumLength,
IN BOOL Dma32BitAddresses,
IN BOOL Dma64BitAddresses,
IN BOOLEAN Dma32BitAddresses,
IN BOOLEAN Dma64BitAddresses,
IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed)
{
@@ -388,7 +388,7 @@ CPortWaveCyclic::NewSlaveDmaChannel(
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex,
IN ULONG MaximumLength,
IN BOOL DemandMode,
IN BOOLEAN DemandMode,
IN DMA_SPEED DmaSpeed)
{
DEVICE_DESCRIPTION DeviceDescription;
@@ -161,7 +161,7 @@ CPortWaveRTStreamInit::GetPhysicalPageAddress(
return RtlConvertUlongToLargeInteger(0);
}
Buffer = UlongToPtr(PtrToUlong(MmGetSystemAddressForMdl(MemoryDescriptorList)) + Index * PAGE_SIZE);
Buffer = (PVOID)UlongToPtr(PtrToUlong(MmGetSystemAddressForMdlSafe(MemoryDescriptorList, LowPagePriority)) + Index * PAGE_SIZE);
Addr = MmGetPhysicalAddress(Buffer);
Address->QuadPart = Addr.QuadPart;
@@ -2,7 +2,6 @@
<!DOCTYPE module SYSTEM "../../../../../tools/rbuild/project.dtd">
<module name="portcls" type="kernelmodedriver" installbase="system32/drivers" installname="portcls.sys" entrypoint="0">
<importlibrary definition="portcls.spec" />
<define name="PC_NO_IMPORTS" />
<redefine name="_WIN32_WINNT">0x600</redefine>
<include base="portcls">.</include>
<library>ntoskrnl</library>
@@ -9,6 +9,8 @@
//#define _KS_NO_ANONYMOUS_STRUCTURES_
#define PC_IMPLEMENTATION
#define COM_STDMETHOD_CAN_THROW
#define PC_NO_IMPORTS
#include <ntddk.h>
#include <portcls.h>
@@ -20,7 +22,7 @@
#include "interfaces.hpp"
#include <ks.h>
#include <ksmedia.h>
#include <intrin.h>
//#include <intrin.h>
#define TAG_PORTCLASS 'SLCP'
@@ -244,8 +246,8 @@ NTAPI
PcDmaSlaveDescription(
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex,
IN BOOL DemandMode,
IN ULONG AutoInitialize,
IN BOOLEAN DemandMode,
IN BOOLEAN AutoInitialize,
IN DMA_SPEED DmaSpeed,
IN ULONG MaximumLength,
IN ULONG DmaPort,
@@ -315,10 +317,11 @@ PcHandlePropertyWithTable(
IN PSUBDEVICE_DESCRIPTOR Descriptor);
#define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\
PropStateHandler, PropDataFormatHandler)\
PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\
DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\
DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler)\
DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler),\
DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(PropAllocatorFraming)\
}
#define DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(GetHandler, SetHandler)\
@@ -336,9 +339,6 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(PropPositionHandler, PropPositionHandler)\
}
#define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
PropGeneral, PropInstances, PropIntersection)\
DEFINE_KSPROPERTY_TABLE(PinSet) {\
@@ -34,6 +34,9 @@ public:
}
IMP_IResourceList;
#ifdef BUILD_WDK
ULONG NTAPI NumberOfEntries();
#endif
CResourceList(IUnknown * OuterUnknown) : m_OuterUnknown(OuterUnknown), m_PoolType(NonPagedPool), m_TranslatedResourceList(0), m_UntranslatedResourceList(0), m_NumberOfEntries(0) {}
virtual ~CResourceList() {}
@@ -72,15 +75,16 @@ CResourceList::QueryInterface(
return STATUS_UNSUCCESSFUL;
}
#if 1
ULONG
NTAPI
CResourceList::NumberOfEntries()
{
// ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
return m_NumberOfEntries;
}
#endif
ULONG
NTAPI
@@ -117,6 +117,8 @@ CServiceGroup::RequestService()
{
KIRQL OldIrql;
DPRINT("CServiceGroup::RequestService() Dpc at Level %u\n", KeGetCurrentIrql());
if (KeGetCurrentIrql() > DISPATCH_LEVEL)
{
KeInsertQueueDpc(&m_Dpc, NULL, NULL);
@@ -48,7 +48,7 @@ WdmAudControlDeviceType(
IN PWDMAUD_CLIENT ClientInfo)
{
ULONG Result = 0;
NTSTATUS Status;
NTSTATUS Status = STATUS_SUCCESS;
PWDMAUD_DEVICE_EXTENSION DeviceExtension;
DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
@@ -179,7 +179,7 @@ WdmAudFrameSize(
Status = ObReferenceObjectByHandle(DeviceInfo->hDevice, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
if (!NT_SUCCESS(Status))
{
DPRINT1("Invalid buffer handle %x\n", DeviceInfo->hDevice);
DPRINT1("Invalid buffer handle %p\n", DeviceInfo->hDevice);
return SetIrpIoStatus(Irp, Status, 0);
}
@@ -343,7 +343,7 @@ WdmAudReadWrite(
Status = ObReferenceObjectByHandle(DeviceInfo->hDevice, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
if (!NT_SUCCESS(Status))
{
DPRINT1("Invalid pin handle %x\n", DeviceInfo->hDevice);
DPRINT1("Invalid pin handle %p\n", DeviceInfo->hDevice);
return SetIrpIoStatus(Irp, Status, 0);
}
+55 -28
View File
@@ -863,7 +863,7 @@ GetControlsFromPinByConnectionIndex(
if (bUpDirection)
{
/* add the sum / mux node to destination line */
//Nodes[NodeIndex] = TRUE;
Nodes[NodeIndex] = TRUE;
}
return STATUS_SUCCESS;
@@ -1005,7 +1005,27 @@ AddMixerControl(
}
MixerInfo->ControlId++;
#if 0
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
{
KSNODEPROPERTY Property;
ULONG PinId = 2;
/* setup the request */
RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY));
Property.NodeId = NodeIndex;
Property.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE;
Property.Property.Flags = KSPROPERTY_TYPE_SET;
Property.Property.Set = KSPROPSETID_Audio;
/* get node volume level info */
Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY), (PVOID)&PinId, sizeof(ULONG), &BytesReturned);
DPRINT1("Status %x NodeIndex %u PinId %u\n", Status, NodeIndex, PinId);
//DbgBreakPoint();
}else
#endif
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
{
KSNODEPROPERTY_AUDIO_CHANNEL Property;
@@ -1041,37 +1061,42 @@ AddMixerControl(
DPRINT("NodeIndex %u Range Min %d Max %d Steps %x UMin %x UMax %x\n", NodeIndex, Range->Bounds.SignedMinimum, Range->Bounds.SignedMaximum, Range->SteppingDelta, Range->Bounds.UnsignedMinimum, Range->Bounds.UnsignedMaximum);
VolumeData = ExAllocatePool(NonPagedPool, sizeof(MIXERVOLUME_DATA));
if (!VolumeData)
return STATUS_INSUFFICIENT_RESOURCES;
MaxRange = Range->Bounds.UnsignedMaximum - Range->Bounds.UnsignedMinimum;
MaxRange = (abs(Range->Bounds.SignedMinimum) + abs(Range->Bounds.SignedMaximum));
Steps = MaxRange / Range->SteppingDelta + 1;
/* store mixer control info there */
VolumeData->Header.dwControlID = MixerControl->dwControlID;
VolumeData->SignedMaximum = Range->Bounds.SignedMaximum;
VolumeData->SignedMinimum = Range->Bounds.SignedMinimum;
VolumeData->SteppingDelta = Range->SteppingDelta;
VolumeData->ValuesCount = Steps;
VolumeData->InputSteppingDelta = 0x10000 / Steps;
VolumeData->Values = ExAllocatePool(NonPagedPool, sizeof(LONG) * Steps);
if (!VolumeData->Values)
if (MaxRange)
{
ExFreePool(Desc);
ExFreePool(VolumeData);
ASSERT(MaxRange);
VolumeData = ExAllocatePool(NonPagedPool, sizeof(MIXERVOLUME_DATA));
if (!VolumeData)
return STATUS_INSUFFICIENT_RESOURCES;
return STATUS_INSUFFICIENT_RESOURCES;
}
Steps = MaxRange / Range->SteppingDelta + 1;
Value = Range->Bounds.SignedMinimum;
for(Index = 0; Index < Steps; Index++)
{
VolumeData->Values[Index] = Value;
Value += Range->SteppingDelta;
}
InsertTailList(&MixerLine->LineControlsExtraData, &VolumeData->Header.Entry);
/* store mixer control info there */
VolumeData->Header.dwControlID = MixerControl->dwControlID;
VolumeData->SignedMaximum = Range->Bounds.SignedMaximum;
VolumeData->SignedMinimum = Range->Bounds.SignedMinimum;
VolumeData->SteppingDelta = Range->SteppingDelta;
VolumeData->ValuesCount = Steps;
VolumeData->InputSteppingDelta = 0x10000 / Steps;
VolumeData->Values = ExAllocatePool(NonPagedPool, sizeof(LONG) * Steps);
if (!VolumeData->Values)
{
ExFreePool(Desc);
ExFreePool(VolumeData);
return STATUS_INSUFFICIENT_RESOURCES;
}
Value = Range->Bounds.SignedMinimum;
for(Index = 0; Index < Steps; Index++)
{
VolumeData->Values[Index] = Value;
Value += Range->SteppingDelta;
}
InsertTailList(&MixerLine->LineControlsExtraData, &VolumeData->Header.Entry);
}
}
ExFreePool(Desc);
}
@@ -1445,6 +1470,7 @@ HandlePhysicalConnection(
PinsSrcRef[Index] = TRUE;
PinsSrcRef[OutConnection->Pin] = TRUE;
}
PinsSrcRef[OutConnection->Pin] = TRUE;
Status = AddMixerSourceLines(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, PinsRefCount, OutConnection->Pin, Index, PinsSrcRef);
@@ -2208,6 +2234,7 @@ WdmAudGetControlDetails(
}
Status = STATUS_NOT_IMPLEMENTED;
DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType);
if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
{
/* send the request */
+2 -2
View File
@@ -20,7 +20,7 @@ Pin_fnDeviceIoControl(
PFILE_OBJECT FileObject;
PIO_STACK_LOCATION IoStack;
DPRINT("Pin_fnDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
DPRINT("Pin_fnDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject, Irp);
/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
@@ -136,7 +136,7 @@ Pin_fnClose(
PDISPATCH_CONTEXT Context;
PIO_STACK_LOCATION IoStack;
DPRINT("Pin_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
DPRINT("Pin_fnClose called DeviceObject %p Irp %p\n", DeviceObject, Irp);
/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
+1 -1
View File
@@ -77,7 +77,7 @@
# define __unaligned
#else
# ifdef __GNUC__
# define __unaligned __attribute((packed))
# define __unaligned
# elif defined(_MSC_VER) && !defined(_M_IA64) && !defined(_M_AMD64)
# define __unaligned
# else
+4 -4
View File
@@ -96,21 +96,21 @@ STDMETHODIMP_(NTSTATUS) BdaPropertyGetPinControl(
STDMETHODIMP_(NTSTATUS) BdaPropertyNodeDescriptors(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
OUT GUID *pguidProperty);
OUT BDANODE_DESCRIPTOR *pNodeDescriptorProperty);
STDMETHODIMP_(NTSTATUS) BdaPropertyNodeEvents(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty);
STDMETHODIMP_(NTSTATUS) BdaPropertyNodeMethods(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty);
STDMETHODIMP_(NTSTATUS) BdaPropertyNodeProperties(
IN PIRP Irp,
IN KSPROPERTY *pKSProperty,
IN KSP_NODE *pKSProperty,
OUT GUID *pguidProperty);
STDMETHODIMP_(NTSTATUS) BdaPropertyNodeTypes(
-2
View File
@@ -329,8 +329,6 @@ typedef enum _SECURITY_LOGON_TYPE
#define MAILSLOT_SIZE_AUTO 0
#define MAP_PROCESS 1L
#define MAP_SYSTEM 2L
#define MEM_DOS_LIM 0x40000000
#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
+6 -6
View File
@@ -1187,7 +1187,7 @@ DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex,
IN ULONG MaximumLength,
IN BOOL DemandMode,
IN BOOLEAN DemandMode,
IN DMA_SPEED DmaSpeed) PURE;
STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
@@ -1195,8 +1195,8 @@ DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG MaximumLength,
IN BOOL Dma32BitAddresses,
IN BOOL Dma64BitAddresses,
IN BOOLEAN Dma32BitAddresses,
IN BOOLEAN Dma64BitAddresses,
IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed) PURE;
@@ -1216,7 +1216,7 @@ typedef IPortWaveCyclic *PPORTWAVECYCLIC;
IN PRESOURCELIST ResourceList OPTIONAL, \
IN ULONG DmaIndex, \
IN ULONG MaximumLength, \
IN BOOL DemandMode, \
IN BOOLEAN DemandMode, \
IN DMA_SPEED DmaSpeed); \
\
STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel( \
@@ -1224,8 +1224,8 @@ typedef IPortWaveCyclic *PPORTWAVECYCLIC;
IN PUNKNOWN OuterUnknown, \
IN PRESOURCELIST ResourceList OPTIONAL, \
IN ULONG MaximumLength, \
IN BOOL Dma32BitAddresses, \
IN BOOL Dma64BitAddresses, \
IN BOOLEAN Dma32BitAddresses, \
IN BOOLEAN Dma64BitAddresses, \
IN DMA_WIDTH DmaWidth, \
IN DMA_SPEED DmaSpeed)
#endif
+8
View File
@@ -5674,6 +5674,14 @@ KefReleaseSpinLockFromDpcLevel(
#elif defined(_M_ARM) // !defined (_X86_)
FORCEINLINE
VOID
KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
{
/* Clear the lock */
*SpinLock = 0;
}
NTHALAPI
KIRQL
FASTCALL
+11 -628
View File
@@ -8,639 +8,22 @@ Header Name:
Abstract:
ASM Offsets for dealing with de-referencing structures in registers.
C-compatible version of the file ks386.inc present in the newest WDK.
Portability header to choose the correct Architecture-specific header.
Author:
Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
--*/
#ifdef _M_AMD64
# include "amd64/asm.h"
#if defined(_M_IX86)
#include <i386/asm.h>
#elif defined(_M_AMD64)
#include <amd64/asm.h>
#elif defined(_M_ARM) || defined(_M_PPC)
//
// ARM and PPC ports don't use asm.h
//
#else
#ifndef _ASM_H
#define _ASM_H
//
// PCR Access
//
#ifdef __ASM__
#ifdef CONFIG_SMP
#define PCR fs:
#else
#define PCR ds:[0xFFDFF000]
#error Unsupported Architecture
#endif
#endif
//
// CPU Modes
//
#define KernelMode 0x0
#define UserMode 0x1
//
// CPU Types
//
#define CPU_NONE 0x0
#define CPU_INTEL 0x1
#define CPU_AMD 0x2
#define CPU_CYRIX 0x3
#define CPU_TRANSMETA 0x4
#define CPU_CENTAUR 0x5
#define CPU_RISE 0x6
#define CPU_UNKNOWN 0x7
//
// Selector Names
//
#ifdef __ASM__
#define RPL_MASK 0x0003
#define MODE_MASK 0x0001
#define KGDT_R0_CODE (0x8)
#define KGDT_R0_DATA (0x10)
#define KGDT_R3_CODE (0x18)
#define KGDT_R3_DATA (0x20)
#define KGDT_TSS (0x28)
#define KGDT_R0_PCR (0x30)
#define KGDT_R3_TEB (0x38)
#define KGDT_LDT (0x48)
#define KGDT_DF_TSS (0x50)
#define KGDT_NMI_TSS (0x58)
#endif
//
// KV86M_REGISTERS Offsets
//
#define KV86M_REGISTERS_EBP 0x0
#define KV86M_REGISTERS_EDI 0x4
#define KV86M_REGISTERS_ESI 0x8
#define KV86M_REGISTERS_EDX 0xC
#define KV86M_REGISTERS_ECX 0x10
#define KV86M_REGISTERS_EBX 0x14
#define KV86M_REGISTERS_EAX 0x18
#define KV86M_REGISTERS_DS 0x1C
#define KV86M_REGISTERS_ES 0x20
#define KV86M_REGISTERS_FS 0x24
#define KV86M_REGISTERS_GS 0x28
#define KV86M_REGISTERS_EIP 0x2C
#define KV86M_REGISTERS_CS 0x30
#define KV86M_REGISTERS_EFLAGS 0x34
#define KV86M_REGISTERS_ESP 0x38
#define KV86M_REGISTERS_SS 0x3C
#define TF_SAVED_EXCEPTION_STACK 0x8C
#define TF_REGS 0x90
#define TF_ORIG_EBP 0x94
//
// TSS Offsets
//
#define KTSS_ESP0 0x4
#define KTSS_CR3 0x1C
#define KTSS_EFLAGS 0x24
#define KTSS_IOMAPBASE 0x66
#define KTSS_IO_MAPS 0x68
//
// KTHREAD Offsets
//
#define KTHREAD_DEBUG_ACTIVE 0x03
#define KTHREAD_INITIAL_STACK 0x18
#define KTHREAD_STACK_LIMIT 0x1C
#define KTHREAD_TEB 0x74
#define KTHREAD_KERNEL_STACK 0x20
#define KTHREAD_ALERTED 0x5E
#define KTHREAD_APCSTATE_PROCESS 0x28 + 0x10
#define KTHREAD_PENDING_USER_APC 0x28 + 0x16
#define KTHREAD_PENDING_KERNEL_APC 0x28 + 0x15
#define KTHREAD_CONTEXT_SWITCHES 0x48
#define KTHREAD_STATE_ 0x4C
#define KTHREAD_NPX_STATE 0x4D
#define KTHREAD_WAIT_IRQL 0x4E
#define KTHREAD_NEXT_PROCESSOR 0x40
#define KTHREAD_WAIT_REASON 0x5A
#define KTHREAD_PRIORITY 0x5B
#define KTHREAD_SWAP_BUSY 0x5D
#define KTHREAD_SERVICE_TABLE 0x118
#define KTHREAD_PREVIOUS_MODE 0xD7
#define KTHREAD_COMBINED_APC_DISABLE 0x70
#define KTHREAD_SPECIAL_APC_DISABLE 0x72
#define KTHREAD_LARGE_STACK 0x107
#define KTHREAD_TRAP_FRAME 0x110
#define KTHREAD_CALLBACK_STACK 0x114
#define KTHREAD_APC_STATE_INDEX 0x11C
#define KTHREAD_STACK_BASE 0x158
#define KTHREAD_QUANTUM 0x15D
#define KTHREAD_KERNEL_TIME 0x160
#define KTHREAD_USER_TIME 0x18C
//
// KPROCESS Offsets
//
#define KPROCESS_DIRECTORY_TABLE_BASE 0x18
#define KPROCESS_LDT_DESCRIPTOR0 0x20
#define KPROCESS_LDT_DESCRIPTOR1 0x24
#define KPROCESS_INT21_DESCRIPTOR0 0x28
#define KPROCESS_INT21_DESCRIPTOR1 0x2C
#define KPROCESS_IOPM_OFFSET 0x30
#define KPROCESS_ACTIVE_PROCESSORS 0x34
#define EPROCESS_VDM_OBJECTS 0x144
//
// KTIMER_TABLE Offsets
//
#ifdef __ASM__
#define KTIMER_TABLE_ENTRY 0x00
#define KTIMER_TABLE_TIME 0x08
#define TIMER_ENTRY_SIZE 0x10
#define TIMER_TABLE_SIZE 0x200
#endif
//
// KPRCB Offsets
//
#define KPRCB_DR0 0x2F8
#define KPRCB_DR1 0x2FC
#define KPRCB_DR2 0x300
#define KPRCB_DR3 0x304
#define KPRCB_DR6 0x308
#define KPRCB_DR7 0x30C
#define KPRCB_TIMER_HAND 0x964
#define KPRCB_TIMER_REQUEST 0x968
//
// KPCR Offsets
//
#define KPCR_EXCEPTION_LIST 0x0
#define KPCR_INITIAL_STACK 0x4
#define KPCR_STACK_LIMIT 0x8
#define KPCR_PERF_GLOBAL_GROUP_MASK 0x8
#define KPCR_CONTEXT_SWITCHES 0x10
#define KPCR_SET_MEMBER_COPY 0x14
#define KPCR_TEB 0x18
#define KPCR_SELF 0x1C
#define KPCR_PRCB 0x20
#define KPCR_IRQL 0x24
#define KPCR_IRR 0x28
#define KPCR_IRR_ACTIVE 0x2C
#define KPCR_IDR 0x30
#define KPCR_KD_VERSION_BLOCK 0x34
#define KPCR_IDT 0x38
#define KPCR_GDT 0x3C
#define KPCR_TSS 0x40
#define KPCR_STALL_SCALE_FACTOR 0x4C
#define KPCR_SET_MEMBER 0x48
#define KPCR_NUMBER 0x51
#define KPCR_VDM_ALERT 0x54
#define KPCR_PRCB_DATA 0x120
#define KPCR_CURRENT_THREAD 0x124
#define KPCR_PRCB_NEXT_THREAD 0x128
#define KPCR_PRCB_IDLE_THREAD 0x12C
#define KPCR_PROCESSOR_NUMBER 0x130
#define KPCR_PRCB_SET_MEMBER 0x134
#define KPCR_PRCB_CPU_TYPE 0x138
#define KPCR_PRCB_PRCB_LOCK 0xA7C
#define KPCR_NPX_THREAD 0x640
#define KPCR_DR6 0x428
#define KPCR_DR7 0x42C
#define KPCR_PRCB_INTERRUPT_COUNT 0x644
#define KPCR_PRCB_KERNEL_TIME 0x648
#define KPCR_PRCB_USER_TIME 0x64C
#define KPCR_PRCB_DPC_TIME 0x650
#define KPCR_PRCB_DEBUG_DPC_TIME 0x654
#define KPCR_PRCB_INTERRUPT_TIME 0x658
#define KPCR_PRCB_ADJUST_DPC_THRESHOLD 0x65C
#define KPCR_PRCB_SKIP_TICK 0x664
#define KPCR_SYSTEM_CALLS 0x6B8
#define KPCR_PRCB_DPC_QUEUE_DEPTH 0xA4C
#define KPCR_PRCB_DPC_COUNT 0xA50
#define KPCR_PRCB_DPC_STACK 0xA68
#define KPCR_PRCB_MAXIMUM_DPC_QUEUE_DEPTH 0xA6C
#define KPCR_PRCB_DPC_REQUEST_RATE 0xA70
#define KPCR_PRCB_DPC_INTERRUPT_REQUESTED 0xA78
#define KPCR_PRCB_DPC_ROUTINE_ACTIVE 0xA7A
#define KPCR_PRCB_DPC_LAST_COUNT 0xA80
#define KPCR_PRCB_TIMER_REQUEST 0xA88
#define KPCR_PRCB_QUANTUM_END 0xAA1
#define KPCR_PRCB_IDLE_SCHEDULE 0xAA3
#define KPCR_PRCB_DEFERRED_READY_LIST_HEAD 0xC10
#define KPCR_PRCB_POWER_STATE_IDLE_FUNCTION 0xEC0
//
// KINTERRUPT Offsets
//
#define KINTERRUPT_INTERRUPT_LIST_HEAD 0x04
#define KINTERRUPT_SERVICE_ROUTINE 0x0C
#define KINTERRUPT_SERVICE_CONTEXT 0x10
#define KINTERRUPT_TICK_COUNT 0x18
#define KINTERRUPT_ACTUAL_LOCK 0x1C
#define KINTERRUPT_VECTOR 0x24
#define KINTERRUPT_IRQL 0x28
#define KINTERRUPT_SYNCHRONIZE_IRQL 0x29
#define KINTERRUPT_DISPATCH_COUNT 0x38
//
// KGDTENTRY Offsets
//
#define KGDT_BASE_LOW 0x2
#define KGDT_BASE_MID 0x4
#define KGDT_BASE_HI 0x7
#define KGDT_LIMIT_HI 0x6
#define KGDT_LIMIT_LOW 0x0
//
// FPU Save Area Offsets
//
#define FP_CONTROL_WORD 0x0
#define FP_STATUS_WORD 0x4
#define FP_TAG_WORD 0x8
#define FP_ERROR_OFFSET 0xC
#define FP_ERROR_SELECTOR 0x10
#define FP_DATA_OFFSET 0x14
#define FP_DATA_SELECTOR 0x18
#define FN_CR0_NPX_STATE 0x20C
#define SIZEOF_FX_SAVE_AREA 528
#define NPX_FRAME_LENGTH 0x210
//
// FX Save Area Offsets
//
#define FX_CONTROL_WORD 0x0
#define FX_STATUS_WORD 0x2
#define FX_TAG_WORD 0x4
#define FX_ERROR_OPCODE 0x6
#define FX_ERROR_OFFSET 0x8
#define FX_ERROR_SELECTOR 0xC
#define FX_DATA_OFFSET 0x10
#define FX_DATA_SELECTOR 0x14
#define FX_MXCSR 0x18
//
// NPX States
//
#define NPX_STATE_NOT_LOADED 0xA
#define NPX_STATE_LOADED 0x0
//
// Trap Frame Offsets
//
#define KTRAP_FRAME_DEBUGEBP 0x0
#define KTRAP_FRAME_DEBUGEIP 0x4
#define KTRAP_FRAME_DEBUGARGMARK 0x8
#define KTRAP_FRAME_DEBUGPOINTER 0xC
#define KTRAP_FRAME_TEMPCS 0x10
#define KTRAP_FRAME_TEMPESP 0x14
#define KTRAP_FRAME_DR0 0x18
#define KTRAP_FRAME_DR1 0x1C
#define KTRAP_FRAME_DR2 0x20
#define KTRAP_FRAME_DR3 0x24
#define KTRAP_FRAME_DR6 0x28
#define KTRAP_FRAME_DR7 0x2C
#define KTRAP_FRAME_GS 0x30
#define KTRAP_FRAME_RESERVED1 0x32
#define KTRAP_FRAME_ES 0x34
#define KTRAP_FRAME_RESERVED2 0x36
#define KTRAP_FRAME_DS 0x38
#define KTRAP_FRAME_RESERVED3 0x3A
#define KTRAP_FRAME_EDX 0x3C
#define KTRAP_FRAME_ECX 0x40
#define KTRAP_FRAME_EAX 0x44
#define KTRAP_FRAME_PREVIOUS_MODE 0x48
#define KTRAP_FRAME_EXCEPTION_LIST 0x4C
#define KTRAP_FRAME_FS 0x50
#define KTRAP_FRAME_RESERVED4 0x52
#define KTRAP_FRAME_EDI 0x54
#define KTRAP_FRAME_ESI 0x58
#define KTRAP_FRAME_EBX 0x5C
#define KTRAP_FRAME_EBP 0x60
#define KTRAP_FRAME_ERROR_CODE 0x64
#define KTRAP_FRAME_EIP 0x68
#define KTRAP_FRAME_CS 0x6C
#define KTRAP_FRAME_EFLAGS 0x70
#define KTRAP_FRAME_ESP 0x74
#define KTRAP_FRAME_SS 0x78
#define KTRAP_FRAME_RESERVED5 0x7A
#define KTRAP_FRAME_V86_ES 0x7C
#define KTRAP_FRAME_RESERVED6 0x7E
#define KTRAP_FRAME_V86_DS 0x80
#define KTRAP_FRAME_RESERVED7 0x82
#define KTRAP_FRAME_V86_FS 0x84
#define KTRAP_FRAME_RESERVED8 0x86
#define KTRAP_FRAME_V86_GS 0x88
#define KTRAP_FRAME_RESERVED9 0x8A
#define KTRAP_FRAME_SIZE 0x8C
#define KTRAP_FRAME_LENGTH 0x8C
#define KTRAP_FRAME_ALIGN 0x04
#define FRAME_EDITED 0xFFF8
//
// KUSER_SHARED_DATA Offsets
//
#ifdef __ASM__
#define USER_SHARED_DATA 0xFFDF0000
#endif
#define USER_SHARED_DATA_INTERRUPT_TIME 0x8
#define USER_SHARED_DATA_SYSTEM_TIME 0x14
#define USER_SHARED_DATA_TICK_COUNT 0x320
//
// KUSER_SHARED_DATA Offsets (this stuff is trash)
//
#define KERNEL_USER_SHARED_DATA 0x7FFE0000
#define KUSER_SHARED_PROCESSOR_FEATURES KERNEL_USER_SHARED_DATA + 0x274
#define KUSER_SHARED_SYSCALL KERNEL_USER_SHARED_DATA + 0x300
#define KUSER_SHARED_SYSCALL_RET KERNEL_USER_SHARED_DATA + 0x304
#define PROCESSOR_FEATURE_FXSR KUSER_SHARED_PROCESSOR_FEATURES + 0x4
//
// CONTEXT Offsets
//
#define CONTEXT_FLAGS 0x0
#define CONTEXT_DR6 0x14
#define CONTEXT_FLOAT_SAVE 0x1C
#define CONTEXT_SEGGS 0x8C
#define CONTEXT_SEGFS 0x90
#define CONTEXT_SEGES 0x94
#define CONTEXT_SEGDS 0x98
#define CONTEXT_EDI 0x9C
#define CONTEXT_ESI 0xA0
#define CONTEXT_EBX 0xA4
#define CONTEXT_EDX 0xA8
#define CONTEXT_ECX 0xAC
#define CONTEXT_EAX 0xB0
#define CONTEXT_EBP 0xB4
#define CONTEXT_EIP 0xB8
#define CONTEXT_SEGCS 0xBC
#define CONTEXT_EFLAGS 0xC0
#define CONTEXT_ESP 0xC4
#define CONTEXT_SEGSS 0xC8
#define CONTEXT_FLOAT_SAVE_CONTROL_WORD CONTEXT_FLOAT_SAVE + FP_CONTROL_WORD
#define CONTEXT_FLOAT_SAVE_STATUS_WORD CONTEXT_FLOAT_SAVE + FP_STATUS_WORD
#define CONTEXT_FLOAT_SAVE_TAG_WORD CONTEXT_FLOAT_SAVE + FP_TAG_WORD
#define CONTEXT_ALIGNED_SIZE 0x2CC
//
// EXCEPTION_RECORD Offsets
//
#define EXCEPTION_RECORD_EXCEPTION_CODE 0x0
#define EXCEPTION_RECORD_EXCEPTION_FLAGS 0x4
#define EXCEPTION_RECORD_EXCEPTION_RECORD 0x8
#define EXCEPTION_RECORD_EXCEPTION_ADDRESS 0xC
#define EXCEPTION_RECORD_NUMBER_PARAMETERS 0x10
#define SIZEOF_EXCEPTION_RECORD 0x14
#define EXCEPTION_RECORD_LENGTH 0x50
//
// Exception types
//
#ifdef __ASM__
#define EXCEPTION_NONCONTINUABLE 0x0001
#define EXCEPTION_UNWINDING 0x0002
#define EXCEPTION_EXIT_UNWIND 0x0004
#define EXCEPTION_STACK_INVALID 0x0008
#define EXCEPTION_NESTED_CALL 0x00010
#define EXCEPTION_TARGET_UNWIND 0x00020
#define EXCEPTION_COLLIDED_UNWIND 0x00040
#define EXCEPTION_UNWIND 0x00066
#define EXCEPTION_EXECUTE_HANDLER 0x00001
#define EXCEPTION_CONTINUE_SEARCH 0x00000
#define EXCEPTION_CONTINUE_EXECUTION 0xFFFFFFFF
#define EXCEPTION_CHAIN_END 0xFFFFFFFF
#endif
//
// TEB Offsets
//
#define TEB_EXCEPTION_LIST 0x0
#define TEB_STACK_BASE 0x4
#define TEB_STACK_LIMIT 0x8
#define TEB_FIBER_DATA 0x10
#define TEB_SELF 0x18
#define TEB_PEB 0x30
#define TEB_EXCEPTION_CODE 0x1A4
#define TEB_ACTIVATION_CONTEXT_STACK_POINTER 0x1A8
#define TEB_DEALLOCATION_STACK 0xE0C
#define TEB_GDI_BATCH_COUNT 0xF70
#define TEB_GUARANTEED_STACK_BYTES 0xF78
#define TEB_FLS_DATA 0xFB4
//
// PEB Offsets
//
#define PEB_KERNEL_CALLBACK_TABLE 0x2C
//
// FIBER Offsets
//
#define FIBER_PARAMETER 0x0
#define FIBER_EXCEPTION_LIST 0x4
#define FIBER_STACK_BASE 0x8
#define FIBER_STACK_LIMIT 0xC
#define FIBER_DEALLOCATION_STACK 0x10
#define FIBER_CONTEXT 0x14
#define FIBER_GUARANTEED_STACK_BYTES 0x2E0
#define FIBER_FLS_DATA 0x2E4
#define FIBER_ACTIVATION_CONTEXT_STACK 0x2E8
#define FIBER_CONTEXT_FLAGS FIBER_CONTEXT + CONTEXT_FLAGS
#define FIBER_CONTEXT_EAX FIBER_CONTEXT + CONTEXT_EAX
#define FIBER_CONTEXT_EBX FIBER_CONTEXT + CONTEXT_EBX
#define FIBER_CONTEXT_ECX FIBER_CONTEXT + CONTEXT_ECX
#define FIBER_CONTEXT_EDX FIBER_CONTEXT + CONTEXT_EDX
#define FIBER_CONTEXT_ESI FIBER_CONTEXT + CONTEXT_ESI
#define FIBER_CONTEXT_EDI FIBER_CONTEXT + CONTEXT_EDI
#define FIBER_CONTEXT_EBP FIBER_CONTEXT + CONTEXT_EBP
#define FIBER_CONTEXT_ESP FIBER_CONTEXT + CONTEXT_ESP
#define FIBER_CONTEXT_DR6 FIBER_CONTEXT + CONTEXT_DR6
#define FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_STATUS_WORD
#define FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_CONTROL_WORD
#define FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD FIBER_CONTEXT + CONTEXT_FLOAT_SAVE_TAG_WORD
//
// EFLAGS
//
#ifdef __ASM__
#define EFLAGS_TF 0x100
#define EFLAGS_INTERRUPT_MASK 0x200
#define EFLAGS_IOPL 0x3000
#define EFLAGS_NESTED_TASK 0x4000
#define EFLAGS_V86_MASK 0x20000
#define EFLAGS_ALIGN_CHECK 0x40000
#define EFLAGS_VIF 0x80000
#define EFLAGS_VIP 0x100000
#define EFLAG_SIGN 0x8000
#define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN + EFLAG_ZERO)
#endif
#define EFLAGS_USER_SANITIZE 0x3F4DD7
//
// CR0
//
#define CR0_PE 0x1
#define CR0_MP 0x2
#define CR0_EM 0x4
#define CR0_TS 0x8
#define CR0_ET 0x10
#define CR0_NE 0x20
#define CR0_WP 0x10000
#define CR0_AM 0x40000
#define CR0_NW 0x20000000
#define CR0_CD 0x40000000
#define CR0_PG 0x80000000
//
// CR4
//
#ifdef __ASM__
#define CR4_VME 0x1
#define CR4_PVI 0x2
#define CR4_TSD 0x4
#define CR4_DE 0x8
#define CR4_PSE 0x10
#define CR4_PAE 0x20
#define CR4_MCE 0x40
#define CR4_PGE 0x80
#define CR4_FXSR 0x200
#define CR4_XMMEXCPT 0x400
#endif
//
// DR6 and 7 Masks
//
#define DR6_LEGAL 0xE00F
#define DR7_LEGAL 0xFFFF0155
#define DR7_ACTIVE 0x55
#define DR7_OVERRIDE_V 0x04
#define DR7_RESERVED_MASK 0xDC00
#define DR7_OVERRIDE_MASK 0xF0000
//
// Usermode callout frame definitions
//
#define CBSTACK_STACK 0x0
#define CBSTACK_TRAP_FRAME 0x4
#define CBSTACK_CALLBACK_STACK 0x8
#define CBSTACK_EBP 0x18
#define CBSTACK_RESULT 0x20
#define CBSTACK_RESULT_LENGTH 0x24
#define CBSTACK_FRAME_POINTER CBSTACK_EBP
//
// NTSTATUS, Bugcheck Codes and Debug Codes
//
#ifdef __ASM__
#define STATUS_ACCESS_VIOLATION 0xC0000005
#define STATUS_IN_PAGE_ERROR 0xC0000006
#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
#define STATUS_STACK_OVERFLOW 0xC00000FD
#define KI_EXCEPTION_ACCESS_VIOLATION 0x10000004
#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C
#define STATUS_NO_CALLBACK_ACTIVE 0xC0000258
#define STATUS_CALLBACK_POP_STACK 0xC0000423
#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
#define STATUS_INVALID_LOCK_SEQUENCE 0xC000001E
#define STATUS_BREAKPOINT 0x80000003
#define STATUS_SINGLE_STEP 0x80000004
#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
#define STATUS_INTEGER_OVERFLOW 0xC0000095
#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
#define STATUS_FLOAT_OVERFLOW 0xC0000091
#define STATUS_FLOAT_STACK_CHECK 0xC0000092
#define STATUS_FLOAT_UNDERFLOW 0xC0000093
#define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
#define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
#define APC_INDEX_MISMATCH 0x01
#define IRQL_NOT_GREATER_OR_EQUAL 0x09
#define IRQL_NOT_LESS_OR_EQUAL 0x0A
#define TRAP_CAUSE_UNKNOWN 0x12
#define KMODE_EXCEPTION_NOT_HANDLED 0x13
#define IRQL_GT_ZERO_AT_SYSTEM_SERVICE 0x4A
#define UNEXPECTED_KERNEL_MODE_TRAP 0x7F
#define ATTEMPTED_SWITCH_FROM_DPC 0xB8
#define HARDWARE_INTERRUPT_STORM 0xF2
#define DBG_STATUS_CONTROL_C 0x01
//
// IRQL Levels
//
#define PASSIVE_LEVEL 0x0
#define APC_LEVEL 0x1
#define DISPATCH_LEVEL 0x2
#define CLOCK2_LEVEL 0x1C
#define IPI_LEVEL 0x1D
#define HIGH_LEVEL 0x1F
//
// Synchronization-level IRQL
//
#ifndef CONFIG_SMP
#define SYNCH_LEVEL DISPATCH_LEVEL
#else
#if (NTDDI_VERSION < NTDDI_WS03)
#define SYNCH_LEVEL (IPI_LEVEL - 0x1)
#else
#define SYNCH_LEVEL (IPI_LEVEL - 0x2)
#endif
#endif
//
// Quantum Decrements
//
#define CLOCK_QUANTUM_DECREMENT 0x3
#endif
//
// System Call Table definitions
//
#define NUMBER_SERVICE_TABLES 0x0002
#define SERVICE_NUMBER_MASK 0x0FFF
#define SERVICE_TABLE_SHIFT 0x0008
#define SERVICE_TABLE_MASK 0x0010
#define SERVICE_TABLE_TEST 0x0010
#define SERVICE_DESCRIPTOR_BASE 0x0000
#define SERVICE_DESCRIPTOR_COUNT 0x0004
#define SERVICE_DESCRIPTOR_LIMIT 0x0008
#define SERVICE_DESCRIPTOR_NUMBER 0x000C
#define SERVICE_DESCRIPTOR_LENGTH 0x0010
//
// VDM State Pointer
//
#define FIXED_NTVDMSTATE_LINEAR_PC_AT 0x714
//
// Machine types
//
#ifdef __ASM__
#define MACHINE_TYPE_ISA 0x0000
#define MACHINE_TYPE_EISA 0x0001
#define MACHINE_TYPE_MCA 0x0002
//
// Kernel Feature Bits
//
#define KF_RDTSC 0x00000002
//
// Kernel Stack Size
//
#define KERNEL_STACK_SIZE 0x3000
#endif
//
// Generic Definitions
//
#define PRIMARY_VECTOR_BASE 0x30 // FIXME: HACK
#define MAXIMUM_IDTVECTOR 0xFF
#endif // !_ASM_H
#endif

Some files were not shown because too many files have changed in this diff Show More