Разработка драйвера C#?

Идея довольно проста. По сути, вы должны идти, пока не дойдете до угла. Это конструкция do / while.

Мы начинаем в верхнем левом углу, поэтому наша начальная позиция - posx = 0 и posy = 0. На каждом шаге мы должны сдвигать одну (1) вправо и одну вниз (1), поэтому в направлении x мы имеем deltax = 1, а в направлении y deltay = 1 для каждого движения.

Если стена поражена, мы должны изменить направление.

Стена в направлении y поражается, если posy = 0 (вверху) или posy имеет размер 1 (нижний столбец), в этом случае дельта изменяет свой знак: deltay = -deltay.

То же самое для x: стена в направлении x удаляется, если posx = 0 (слева) или posx имеет размер-1 (крайний правый столбец), в этом случае deltax меняет свой знак: deltax = -deltax.

Для простоты я сделал sizex-1 и sizey-1 в самом начале (sizex--; sizey--;), поэтому тест просто проверяет размер.

Это должно прекратиться, когда мы попадаем в угол, то есть когда мы ударяемся о стены в направлении y и x.

Я добавил логическое значение, которое печатает отдельные шаги, если установлено значение true.

[Может быть, вы хотите добавить дополнительную проверку для недопустимых прямоугольников, таких как diagonalWalk (-1, -1)]

public static int diagonalWalk(int sizex, int sizey, boolean showSteps) {
    int posx = 0;
    int posy = 0;
    int sum = 1;
    int deltay = 1;
    int deltax = 1;
    sizex--;//valid cols are: 0 - sizex-1
    sizey--;//valid rows are: 0 - sizey-1
    if (showSteps) {
        System.out.println("At: 0/0:1");
    }
    do {
        posx += deltax;
        posy += deltay;
        sum += Math.pow(2, posx) * Math.pow(2, posy);
        if (showSteps) {
            System.out.println("At: " + posy + "/" + posx + ":" + Math.pow(2, posx) * Math.pow(2, posy));
        }

        //wallhit left or right
        if (posx == 0 || posx >= sizex) {
            deltax = -deltax;
        }
        //wallhit top or bottom
        if (posy == 0 || posy >= sizey) {
            deltay = -deltay;
        }
    }while(!((posx == 0 || posx >= sizex) && (posy == 0 || posy >= sizey)));
    return sum;
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int sum = diagonalWalk(3,4, true);
    System.out.println("result is:" + sum);
}

пример выполнения:

At: 0/0:1
At: 1/1:4.0
At: 2/2:16.0
At: 3/1:16.0
At: 2/0:4.0
At: 1/1:4.0
At: 0/2:4.0
result is:49
15
задан Adam Davis 16 September 2008 в 19:14
поделиться

7 ответов

Вы не можете сделать драйверы устройств привилегированного режима в C#, поскольку время выполнения не может быть безопасно загружено в ring0 и работать как ожидалось.

Кроме того, C# не создает двоичные файлы, подходящие для загрузки как драйверы устройств, особенно относительно точек входа, которые должны представить драйверы. Зависимость от времени выполнения, чтобы вскочить и проанализировать и JIT, двоичный файл во время загрузки запрещает прямой доступ подсистема драйвера, должна загрузить двоичный файл.

существует работа в стадии реализации, однако, для подъема некоторых драйверов устройств в непривилегированный режим, Вы видите интервью здесь с Peter Wieland UDMF (Платформа Драйвера Непривилегированного режима) команда.

драйверы Непривилегированного режима намного больше подошли бы для управляемой работы, но необходимо будет погуглить немного, чтобы узнать, будут ли C# и.NET непосредственно поддерживаться. Все, что я знаю, - то, что драйверы уровня ядра не являются выполнимыми только в C#.

можно, однако, вероятно, сделать драйвер C/C++ и сервис C# (или подобный) и иметь драйвер, говорят с управляемым кодом, если абсолютно необходимо написать много кода в C#.

26
ответ дан 1 December 2019 в 01:00
поделиться

Это должно помочь Вам способом: Windows Driver Kit

4
ответ дан 1 December 2019 в 01:00
поделиться

Это не прямой ответ на Ваш вопрос, но если Вам интересно, Вы могли бы посмотреть проект .

Особенности
3
ответ дан 1 December 2019 в 01:00
поделиться

кто-либо может говорить с надежностью и безопасностью запущения программы C# ближе для Вызова 0, чем обычно имел бы место?

C# работает в Виртуальной машине.NET, Вы не можете переместить его немного ближе для Вызова 0, чем VM, и выполнения VM в пространстве пользователя.

2
ответ дан 1 December 2019 в 01:00
поделиться

Запись драйверов устройств в .NET не имеет никакого смысла для текущих версий окон.

< speculation>
Слухи - то, что MS инвестирует много денег в обеспечении Особенности к следующему уровню. Просто ищите Midori. Но это - 2015 +
</speculation>

1
ответ дан 1 December 2019 в 01:00
поделиться

Microsoft имеет много исследовательских проектов в области наличия управляемого кода ОС, другими словами, уничтожьте с API Win32.

См. статью Mary Jo Foley: Восстановление Наследия

1
ответ дан 1 December 2019 в 01:00
поделиться

Если вы хотите попробовать проприетарный фреймворк, инструментарий Jungo WinDriver поддерживает разработку драйверов пользовательского режима (даже в управляемом коде) для USB, PCI, и устройства PCI-E.

2
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: