Merge trunk (r43561)
svn path=/branches/ros-amd64-bringup/; revision=43562
@@ -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 == '$')
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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* );
|
||||
|
||||
@@ -424,4 +424,4 @@ library WindowsInstaller
|
||||
properties:
|
||||
methods:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>
|
||||
@@ -0,0 +1,6 @@
|
||||
@ stdcall AcsHlpAttemptConnection(ptr)
|
||||
@ stub AcsHlpNbConnection
|
||||
@ stdcall AcsHlpNoteNewConnection(ptr ptr)
|
||||
@ stdcall WSAttemptAutodialAddr(ptr long)
|
||||
@ stdcall WSAttemptAutodialName(ptr)
|
||||
@ stdcall WSNoteSuccessfulHostentLookup(ptr long)
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||