Виртуализация Legacy API и сосуществование с более современным API?

Способ sizeof - это правильный путь iff , который вы имеете в виду массивы, не полученные в качестве параметров. Массив, отправленный как параметр функции, рассматривается как указатель, поэтому sizeof вернет размер указателя вместо массива.

Таким образом, внутри функций этот метод не работает. Вместо этого всегда передавайте дополнительный параметр size_t size, указывающий количество элементов в массиве.

Тест:

#include 
#include 

void printSizeOf(int intArray[]);
void printLength(int intArray[]);

int main(int argc, char* argv[])
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };

    printf("sizeof of array: %d\n", (int) sizeof(array));
    printSizeOf(array);

    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
    printLength(array);
}

void printSizeOf(int intArray[])
{
    printf("sizeof of parameter: %d\n", (int) sizeof(intArray));
}

void printLength(int intArray[])
{
    printf("Length of parameter: %d\n", (int)( sizeof(intArray) / sizeof(intArray[0]) ));
}

Выход (в 64-разрядной ОС Linux):

sizeof of array: 28
sizeof of parameter: 8
Length of array: 7
Length of parameter: 2

Вывод (в 32-разрядной ОС Windows):

sizeof of array: 28
sizeof of parameter: 4
Length of array: 7
Length of parameter: 1

1
задан Pharaun 13 May 2010 в 15:40
поделиться

2 ответа

Что меня озадачивает в связи с этим вопросом, когда он возникает, так это то, что Windows делает это с момента выхода NT в середине девяностых. Вот как NT запускает программы DOS и Win16, и как всегда. Уровень виртуализации NTVDM запускает 16-битные приложения под Win32 с очень небольшой специальной поддержкой со стороны базовой ОС. Это всего лишь один пример - другой - WINE, который, насколько я понимаю, выполняет довольно разумную работу по запуску приложений Windows поверх набора API, который сильно отличается от набора Windows. Так что это определенно возможно.

Более уместный вопрос, почему Microsoft будет рассматривать это. Чтобы вы могли думать, вам нужно думать о двух вещах. 1) Есть что-то лучшее для замены Win32 API и 2) Поддержка Win32 API является обузой.

Оба эти утверждения сомнительны. В случае функций ядра, таких как доступ к оборудованию, синхронизация и выполнение потоков, процессов и памяти, Win32 API выполняет довольно хорошую работу и в конечном итоге очень близок к тому, что действительно делает ядро. Если вы думаете, что есть лучший API, значит, есть и лучшее ядро. Я лично не думаю, что NT нуждается в замене прямо сейчас. Что касается графики и работы с окнами, то, как ни странно, gdi32 немного длинноват. Но Microsoft решила эту проблему, построив WPF одновременно с ним. Тогда возникает вопрос о бремени. Что ж, конечно, есть два API, которые нужно поддерживать, но если вы виртуализировали GDI поверх WPF, вам все равно придется поддерживать оба, поэтому от этого нет никакой пользы.Преимущество параллельной работы обоих состоит в том, что GDI уже существует и уже протестирован. Все, что вам нужно сделать, это исправить случайную ошибку, тогда как новый уровень виртуализации придется писать и тестировать заново, что отнимает время, чтобы улучшить WPF.

С точки зрения поддержания спины, это не такая большая проблема, как кажется. В основном это тестовый вопрос - вы должны проверить, что поведение API не меняется, но, опять же, эти тесты уже написаны, так что на самом деле это не дополнительная работа.

Итак, чтобы ответить на вопрос вопросом, зачем им беспокоиться?

1
ответ дан 3 September 2019 в 00:33
поделиться

Это интересный вопрос, по крайней мере для меня, вот некоторые из моих мыслей.

Вы правильно поняли, приложение, работающее на виртуальной машине XP, имеет доступ только к API Win32, предоставляемым XP на виртуальной машине. Один из многих способов, с помощью которых я видел подход Microsoft к расширению конкретных API-интерфейсов, - это создание новых функций с расширенными / фиксированными функциями и присвоение имени новой функции путем добавления Ex и даже ExEx к исходному имени, например

GetVersion
GetVersionEx

Для функций, которые принимать указатели на структуры, структуры `` версируются '' с использованием размера структуры для определения требуемой функциональности, поэтому старый код будет передавать предыдущий размер структуры, в то время как более новый код будет передаваться в более новую структуру большего размера и API функционирует соответственно.

Я полагаю , проблема заключалась в том, что это уже не просто различия в том, как работает API, но более неотъемлемая часть функционирования операционной системы и внутренних структур, которые претерпели достаточно значительные изменения, что, возможно, плохо написанный код фактически сломан.

Что касается вашего фактического вопроса, я думаю, это будет довольно сложно. Даже если кто-то подумал позволить ОС настроить выполнение кода на основе целевой версии ОС в PE-заголовке исполняемого файла, что произойдет, если более новая DLL будет загружена в процесс, ориентированный на последнюю ОС, теперь как ОС должна справиться с этим, когда код выполняется? ИМХО, я думаю, что это было бы очень сложно, бояться ловушек, которые в конечном итоге потерпят неудачу.

Конечно, это всего лишь мои грубые мысли по теме, поэтому я могу ошибаться на 100%, и есть простой подход, который просто не пришел в голову.

1
ответ дан 3 September 2019 в 00:33
поделиться
Другие вопросы по тегам:

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