- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
//
// Замена блоков __try/__finally нашей реализацией. Примеры использования:
// NTSTATUS SomeFunc() {
// X *p = NULL;
// NTSTATUS status = STATUS_SUCCESS;
// Try {
// p = new(NonPagedPool) X;
// if (!p) Leave(status = STATUS_INSUFFICIENT_RESOURCES);
//
// status = SomeKernelFunc();
// LeaveNS(status = STATUS_UNSUCCESSFUL);
// } Finally {
// if (p) delete p;
// }
// return status;
// }
//
#define Try if (1)
#define Finally try_exit: NOTHING
#define Leave(s) { s; goto try_exit; }
#define LeaveNS(s) {if (!NT_SUCCESS(status)) Leave(s);}
#define Run(s) {status = s; LeaveNS(;);}
P.s. велик и могуч препроцессор си