⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conio.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 5 页
字号:
                          Y = 0;
                          Buffer = Buff->Buffer;
                        }
                      X = 0;
                    }
                }
              if (NULL != Console && Buff == Console->ActiveBuffer)
                {
                  ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord,
                                         Request->Data.WriteConsoleOutputCharRequest.Length);
                  ConioDrawRegion(Console, &UpdateRect);
                }

                Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X - Buff->ShowX;
                Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY;

                ConioUnlockScreenBuffer(Buff);
            }
          if (Request->Data.WriteConsoleRequest.Unicode)
            {
              RtlFreeHeap(GetProcessHeap(), 0, tmpString);
            }
        }
      if (NULL != Console)
        {
          ConioUnlockConsole(Console);
        }
    }
  Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written;
  return Request->Status = Status;
}

CSR_API(CsrFillOutputChar)
{
  NTSTATUS Status;
  PCSRSS_CONSOLE Console;
  PCSRSS_SCREEN_BUFFER Buff;
  DWORD X, Y, Length, Written = 0;
  CHAR Char;
  PBYTE Buffer;
  RECT UpdateRect;

  DPRINT("CsrFillOutputChar\n");

  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);

  Status = ConioConsoleFromProcessData(ProcessData, &Console);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }

  Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff);
  if (! NT_SUCCESS(Status))
    {
      if (NULL != Console)
        {
          ConioUnlockConsole(Console);
        }
      return Request->Status = Status;
    }

  X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
  Y = (Request->Data.FillOutputRequest.Position.Y + Buff->ShowY) % Buff->MaxY;
  Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
  if(Request->Data.FillOutputRequest.Unicode)
    ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar);
  else
    Char = Request->Data.FillOutputRequest.Char.AsciiChar;
  Length = Request->Data.FillOutputRequest.Length;
  while (Length--)
    {
      *Buffer = Char;
      Buffer += 2;
      Written++;
      if (++X == Buff->MaxX)
        {
          if (++Y == Buff->MaxY)
            {
              Y = 0;
              Buffer = Buff->Buffer;
            }
          X = 0;
        }
    }

  if (NULL != Console && Buff == Console->ActiveBuffer)
    {
      ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position,
                             Request->Data.FillOutputRequest.Length);
      ConioDrawRegion(Console, &UpdateRect);
    }

  ConioUnlockScreenBuffer(Buff);
  if (NULL != Console)
    {
      ConioUnlockConsole(Console);
    }
  Length = Request->Data.FillOutputRequest.Length;
  Request->Data.FillOutputRequest.NrCharactersWritten = Length;
  return Request->Status;
}

CSR_API(CsrReadInputEvent)
{
  PLIST_ENTRY CurrentEntry;
  PCSRSS_CONSOLE Console;
  NTSTATUS Status;
  BOOLEAN Done = FALSE;
  ConsoleInput *Input;

  DPRINT("CsrReadInputEvent\n");

  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
  Request->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent;

  Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }

  /* only get input if there is any */
  CurrentEntry = Console->InputEvents.Flink;
  while (CurrentEntry != &Console->InputEvents)
    {
      Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry);
      CurrentEntry = CurrentEntry->Flink;

      if (Done && !Input->Fake)
        {
          Request->Data.ReadInputRequest.MoreEvents = TRUE;
          break;
        }

      RemoveEntryList(&Input->ListEntry);

      if (!Done && !Input->Fake)
        {
          Request->Data.ReadInputRequest.Input = Input->InputEvent;
          if (Request->Data.ReadInputRequest.Unicode == FALSE)
            {
              ConioInputEventToAnsi(Console, &Request->Data.ReadInputRequest.Input);
            }
          Done = TRUE;
        }

      if (Input->InputEvent.EventType == KEY_EVENT)
        {
          if (0 != (Console->Mode & ENABLE_LINE_INPUT)
              && Input->InputEvent.Event.KeyEvent.bKeyDown
              && '\r' == Input->InputEvent.Event.KeyEvent.uChar.AsciiChar)
            {
              Console->WaitingLines--;
            }
          Console->WaitingChars--;
        }
      HeapFree(Win32CsrApiHeap, 0, Input);
    }

  if (Done)
    {
      Status = STATUS_SUCCESS;
      Console->EarlyReturn = FALSE;
    }
  else
    {
      Status = STATUS_PENDING;
      Console->EarlyReturn = TRUE;  /* mark for early return */
    }

  if (IsListEmpty(&Console->InputEvents))
    {
      ResetEvent(Console->ActiveEvent);
    }

  ConioUnlockConsole(Console);

  return Request->Status = Status;
}

CSR_API(CsrWriteConsoleOutputAttrib)
{
  PCSRSS_CONSOLE Console;
  PCSRSS_SCREEN_BUFFER Buff;
  PUCHAR Buffer;
  PWORD Attribute;
  int X, Y, Length;
  NTSTATUS Status;
  RECT UpdateRect;

  DPRINT("CsrWriteConsoleOutputAttrib\n");

  if (Request->Header.u1.s1.TotalLength
      < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)
        + Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD))
    {
      DPRINT1("Invalid request size\n");
      Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
      Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
      return Request->Status = STATUS_INVALID_PARAMETER;
    }

  Status = ConioConsoleFromProcessData(ProcessData, &Console);
  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }

  Status = ConioLockScreenBuffer(ProcessData,
                                 Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle,
                                 &Buff);
  if (! NT_SUCCESS(Status))
    {
      if (NULL != Console)
        {
          ConioUnlockConsole(Console);
        }
      return Request->Status = Status;
    }

  X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX;
  Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
  Length = Request->Data.WriteConsoleOutputAttribRequest.Length;
  Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
  Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute;
  while (Length--)
    {
      *Buffer = (UCHAR)(*Attribute++);
      Buffer += 2;
      if (++X == Buff->MaxX)
        {
          if (++Y == Buff->MaxY)
            {
              Y = 0;
              Buffer = Buff->Buffer + 1;
            }
          X = 0;
        }
    }

  if (NULL != Console && Buff == Console->ActiveBuffer)
    {
      ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord,
                             Request->Data.WriteConsoleOutputAttribRequest.Length);
      ConioDrawRegion(Console, &UpdateRect);
    }

  if (NULL != Console)
    {
      ConioUnlockConsole(Console);
    }

  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = Buff->CurrentX - Buff->ShowX;
  Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;

  ConioUnlockScreenBuffer(Buff);

  return Request->Status = STATUS_SUCCESS;
}

CSR_API(CsrFillOutputAttrib)
{
  PCSRSS_SCREEN_BUFFER Buff;
  PUCHAR Buffer;
  NTSTATUS Status;
  int X, Y, Length;
  UCHAR Attr;
  RECT UpdateRect;
  PCSRSS_CONSOLE Console;

  DPRINT("CsrFillOutputAttrib\n");

  Status = ConioConsoleFromProcessData(ProcessData, &Console);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }

  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
  Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff);
  if (! NT_SUCCESS(Status))
    {
      if (NULL != Console)
        {
          ConioUnlockConsole(Console);
        }
      return Request->Status = Status;
    }

  X = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX;
  Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
  Length = Request->Data.FillOutputAttribRequest.Length;
  Attr = Request->Data.FillOutputAttribRequest.Attribute;
  Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1];
  while (Length--)
    {
      *Buffer = Attr;
      Buffer += 2;
      if (++X == Buff->MaxX)
        {
          if (++Y == Buff->MaxY)
            {
              Y = 0;
              Buffer = Buff->Buffer + 1;
            }
          X = 0;
        }
    }

  if (NULL != Console && Buff == Console->ActiveBuffer)
    {
      ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord,
                             Request->Data.FillOutputAttribRequest.Length);
      ConioDrawRegion(Console, &UpdateRect);
    }

  ConioUnlockScreenBuffer(Buff);
  if (NULL != Console)
    {
      ConioUnlockConsole(Console);
    }

  return Request->Status = STATUS_SUCCESS;
}


CSR_API(CsrGetCursorInfo)
{
  PCSRSS_SCREEN_BUFFER Buff;
  NTSTATUS Status;

  DPRINT("CsrGetCursorInfo\n");

  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);

  Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }
  Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible;
  Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize;
  ConioUnlockScreenBuffer(Buff);

  return Request->Status = STATUS_SUCCESS;
}

CSR_API(CsrSetCursorInfo)
{
  PCSRSS_CONSOLE Console;
  PCSRSS_SCREEN_BUFFER Buff;
  DWORD Size;
  BOOL Visible;
  NTSTATUS Status;

  DPRINT("CsrSetCursorInfo\n");

  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);

  Status = ConioConsoleFromProcessData(ProcessData, &Console);
  if (! NT_SUCCESS(Status))
    {
      return Request->Status = Status;
    }

  Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff);
  if (! NT_SUCCESS(Status))
    {
      if (NULL != Console)
        {
          ConioUnlockConsole(Console);
        }
      return Request->Status = Status;
    }

  Size = Request->Data.SetCursorInfoRequest.Info.dwSize;
  Visible = Request->Data.SetCursorInfoRequest.Info.bVisible;
  if (Size < 1)
    {
      Size = 1;
    }
  if (100 < Size)
    {
      Size = 100;
    }

  if (Size != Buff->CursorInfo.dwSize
      || (Visible && ! Buff->CursorInfo.bVisible) || (! Visible && Buff->CursorInfo.bVisible))
    {
      Buff->CursorInfo.dwSize = Size;
      Buff->CursorInfo.bVisible = Visible;

      if (NULL != Console && ! ConioSetCursorInfo(Console, Buff))
        {
          ConioUnlockScreenBuffer(Buff);
          ConioUnlo

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -